<!DOCTYPE html>
<html lang="zh-CN" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>semantic-release | 龙陌的博客</title>
    <meta name="description" content="基于vite为基础搭建的风格脚手架,提供多种模板以便于更高效的解决业务需求！">
    <meta name="generator" content="VitePress v1.0.1">
    <link rel="preload stylesheet" href="/long-press/assets/style.BL65bImA.css" as="style">
    
    <script type="module" src="/long-press/assets/app.CKtEL6mi.js"></script>
    <link rel="preload" href="/long-press/assets/inter-roman-latin.Bu8hRsVA.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="modulepreload" href="/long-press/assets/chunks/framework.Cp_of1Ge.js">
    <link rel="modulepreload" href="/long-press/assets/chunks/theme.hH2tFlJ7.js">
    <link rel="modulepreload" href="/long-press/assets/chunks/PageInfo.vue_vue_type_script_setup_true_lang.9LRWY4ho.js">
    <link rel="modulepreload" href="/long-press/assets/chunks/dayjs.min.BrPrGVY0.js">
    <link rel="modulepreload" href="/long-press/assets/nodejs_semantic-release.md.B_4_SZrq.lean.js">
    <link rel="icon" type="image/svg+xml" href="logo.ico">
    <meta name="author" content="龙陌">
    <meta name="referrer" content="no-referrer">
    <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
    <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
  </head>
  <body>
    <div id="app"><div class="Layout" data-v-4c760b95><!--[--><!--]--><!--[--><span tabindex="-1" data-v-16c53dd7></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-16c53dd7> Skip to content </a><!--]--><!----><header class="VPNav" data-v-4c760b95 data-v-0a463f3f><div class="VPNavBar has-sidebar top" data-v-0a463f3f data-v-460dba10><div class="wrapper" data-v-460dba10><div class="container" data-v-460dba10><div class="title" data-v-460dba10><div class="VPNavBarTitle has-sidebar" data-v-460dba10 data-v-ef777607><a class="title" href="/long-press/" data-v-ef777607><!--[--><!--]--><!--[--><img class="VPImage logo" src="/long-press/logo.ico" alt data-v-9cb742f0><!--]--><span data-v-ef777607>龙陌的博客</span><!--[--><!--]--></a></div></div><div class="content" data-v-460dba10><div class="content-body" data-v-460dba10><!--[--><!--]--><div class="VPNavBarSearch search" data-v-460dba10><!----><div id="docsearch"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><span class="DocSearch-Button-Key">Meta</span><span class="DocSearch-Button-Key">K</span></span></button></div></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-460dba10 data-v-b298d4fd><span id="main-nav-aria-label" class="visually-hidden" data-v-b298d4fd>Main Navigation</span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/long-press/" tabindex="0" data-v-b298d4fd data-v-5d92c3a7><!--[--><span data-v-5d92c3a7>💻 首页</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/long-press/guide/" tabindex="0" data-v-b298d4fd data-v-5d92c3a7><!--[--><span data-v-5d92c3a7>💡 指南</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/long-press/tools/" tabindex="0" data-v-b298d4fd data-v-5d92c3a7><!--[--><span data-v-5d92c3a7>🔧 编程工具</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/long-press/utils/" tabindex="0" data-v-b298d4fd data-v-5d92c3a7><!--[--><span data-v-5d92c3a7>🔧 常用工具类</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/long-press/standard/" tabindex="0" data-v-b298d4fd data-v-5d92c3a7><!--[--><span data-v-5d92c3a7>📋 前端规范</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/long-press/react/React实战,设计模式与最佳实践/" tabindex="0" data-v-b298d4fd data-v-5d92c3a7><!--[--><span data-v-5d92c3a7>⭐ React</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/long-press/typescript/" tabindex="0" data-v-b298d4fd data-v-5d92c3a7><!--[--><span data-v-5d92c3a7>⭐ TypeScript</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/long-press/css3/" tabindex="0" data-v-b298d4fd data-v-5d92c3a7><!--[--><span data-v-5d92c3a7>⭐ Css3</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/long-press/electron/" tabindex="0" data-v-b298d4fd data-v-5d92c3a7><!--[--><span data-v-5d92c3a7>⭐ Electron</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/long-press/linux/linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4" tabindex="0" data-v-b298d4fd data-v-5d92c3a7><!--[--><span data-v-5d92c3a7>⭐ Linux</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-460dba10 data-v-815abbf3><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-815abbf3 data-v-34066301 data-v-b6ab5a8a><span class="check" data-v-b6ab5a8a><span class="icon" data-v-b6ab5a8a><!--[--><span class="vpi-sun sun" data-v-34066301></span><span class="vpi-moon moon" data-v-34066301></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-460dba10 data-v-a0947e71 data-v-2fe70121><!--[--><a class="VPSocialLink no-icon" href="https://vitepress.vuejs.org/guide/getting-started" aria-label="github" target="_blank" rel="noopener" data-v-2fe70121 data-v-39684c0a><span class="vpi-social-github" /></a><a class="VPSocialLink no-icon" href="https://space.bilibili.com/248956095" aria-label target="_blank" rel="noopener" data-v-2fe70121 data-v-39684c0a><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="20" height="20"  viewBox="0 0 512 512" >
    <path fill="currentColor" d="M488.6 104.1c16.7 18.1 24.4 39.7 23.3 65.7v202.4c-.4 26.4-9.2 48.1-26.5 65.1c-17.2 17-39.1 25.9-65.5 26.7H92.02c-26.45-.8-48.21-9.8-65.28-27.2C9.682 419.4.767 396.5 0 368.2V169.8c.767-26 9.682-47.6 26.74-65.7C43.81 87.75 65.57 78.77 92.02 78h29.38L96.05 52.19c-5.75-5.73-8.63-13-8.63-21.79c0-8.8 2.88-16.06 8.63-21.797C101.8 2.868 109.1 0 117.9 0s16.1 2.868 21.9 8.603L213.1 78h88l74.5-69.397C381.7 2.868 389.2 0 398 0c8.8 0 16.1 2.868 21.9 8.603c5.7 5.737 8.6 12.997 8.6 21.797c0 8.79-2.9 16.06-8.6 21.79L394.6 78h29.3c26.4.77 48 9.75 64.7 26.1zm-38.8 69.7c-.4-9.6-3.7-17.4-10.7-23.5c-5.2-6.1-14-9.4-22.7-9.8H96.05c-9.59.4-17.45 3.7-23.58 9.8c-6.14 6.1-9.4 13.9-9.78 23.5v194.4c0 9.2 3.26 17 9.78 23.5s14.38 9.8 23.58 9.8H416.4c9.2 0 17-3.3 23.3-9.8c6.3-6.5 9.7-14.3 10.1-23.5V173.8zm-264.3 42.7c6.3 6.3 9.7 14.1 10.1 23.2V273c-.4 9.2-3.7 16.9-9.8 23.2c-6.2 6.3-14 9.5-23.6 9.5c-9.6 0-17.5-3.2-23.6-9.5c-6.1-6.3-9.4-14-9.8-23.2v-33.3c.4-9.1 3.8-16.9 10.1-23.2c6.3-6.3 13.2-9.6 23.3-10c9.2.4 17 3.7 23.3 10zm191.5 0c6.3 6.3 9.7 14.1 10.1 23.2V273c-.4 9.2-3.7 16.9-9.8 23.2c-6.1 6.3-14 9.5-23.6 9.5c-9.6 0-17.4-3.2-23.6-9.5c-7-6.3-9.4-14-9.7-23.2v-33.3c.3-9.1 3.7-16.9 10-23.2c6.3-6.3 14.1-9.6 23.3-10c9.2.4 17 3.7 23.3 10z"></path>
  </svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-460dba10 data-v-b81df352 data-v-603fa601><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-603fa601><span class="vpi-more-horizontal icon" data-v-603fa601></span></button><div class="menu" data-v-603fa601><div class="VPMenu" data-v-603fa601 data-v-61aada2f><!----><!--[--><!--[--><!----><div class="group" data-v-b81df352><div class="item appearance" data-v-b81df352><p class="label" data-v-b81df352>外观</p><div class="appearance-action" data-v-b81df352><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-b81df352 data-v-34066301 data-v-b6ab5a8a><span class="check" data-v-b6ab5a8a><span class="icon" data-v-b6ab5a8a><!--[--><span class="vpi-sun sun" data-v-34066301></span><span class="vpi-moon moon" data-v-34066301></span><!--]--></span></span></button></div></div></div><div class="group" data-v-b81df352><div class="item social-links" data-v-b81df352><div class="VPSocialLinks social-links-list" data-v-b81df352 data-v-2fe70121><!--[--><a class="VPSocialLink no-icon" href="https://vitepress.vuejs.org/guide/getting-started" aria-label="github" target="_blank" rel="noopener" data-v-2fe70121 data-v-39684c0a><span class="vpi-social-github" /></a><a class="VPSocialLink no-icon" href="https://space.bilibili.com/248956095" aria-label target="_blank" rel="noopener" data-v-2fe70121 data-v-39684c0a><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="20" height="20"  viewBox="0 0 512 512" >
    <path fill="currentColor" d="M488.6 104.1c16.7 18.1 24.4 39.7 23.3 65.7v202.4c-.4 26.4-9.2 48.1-26.5 65.1c-17.2 17-39.1 25.9-65.5 26.7H92.02c-26.45-.8-48.21-9.8-65.28-27.2C9.682 419.4.767 396.5 0 368.2V169.8c.767-26 9.682-47.6 26.74-65.7C43.81 87.75 65.57 78.77 92.02 78h29.38L96.05 52.19c-5.75-5.73-8.63-13-8.63-21.79c0-8.8 2.88-16.06 8.63-21.797C101.8 2.868 109.1 0 117.9 0s16.1 2.868 21.9 8.603L213.1 78h88l74.5-69.397C381.7 2.868 389.2 0 398 0c8.8 0 16.1 2.868 21.9 8.603c5.7 5.737 8.6 12.997 8.6 21.797c0 8.79-2.9 16.06-8.6 21.79L394.6 78h29.3c26.4.77 48 9.75 64.7 26.1zm-38.8 69.7c-.4-9.6-3.7-17.4-10.7-23.5c-5.2-6.1-14-9.4-22.7-9.8H96.05c-9.59.4-17.45 3.7-23.58 9.8c-6.14 6.1-9.4 13.9-9.78 23.5v194.4c0 9.2 3.26 17 9.78 23.5s14.38 9.8 23.58 9.8H416.4c9.2 0 17-3.3 23.3-9.8c6.3-6.5 9.7-14.3 10.1-23.5V173.8zm-264.3 42.7c6.3 6.3 9.7 14.1 10.1 23.2V273c-.4 9.2-3.7 16.9-9.8 23.2c-6.2 6.3-14 9.5-23.6 9.5c-9.6 0-17.5-3.2-23.6-9.5c-6.1-6.3-9.4-14-9.8-23.2v-33.3c.4-9.1 3.8-16.9 10.1-23.2c6.3-6.3 13.2-9.6 23.3-10c9.2.4 17 3.7 23.3 10zm191.5 0c6.3 6.3 9.7 14.1 10.1 23.2V273c-.4 9.2-3.7 16.9-9.8 23.2c-6.1 6.3-14 9.5-23.6 9.5c-9.6 0-17.4-3.2-23.6-9.5c-7-6.3-9.4-14-9.7-23.2v-33.3c.3-9.1 3.7-16.9 10-23.2c6.3-6.3 14.1-9.6 23.3-10c9.2.4 17 3.7 23.3 10z"></path>
  </svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-460dba10 data-v-156ee799><span class="container" data-v-156ee799><span class="top" data-v-156ee799></span><span class="middle" data-v-156ee799></span><span class="bottom" data-v-156ee799></span></span></button></div></div></div></div><div class="divider" data-v-460dba10><div class="divider-line" data-v-460dba10></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-4c760b95 data-v-bc5dff2d><div class="container" data-v-bc5dff2d><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-bc5dff2d><span class="vpi-align-left menu-icon" data-v-bc5dff2d></span><span class="menu-text" data-v-bc5dff2d>归档</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-bc5dff2d data-v-fe28bfa1><button data-v-fe28bfa1>返回顶部</button><!----></div></div></div><aside class="VPSidebar" data-v-4c760b95 data-v-e1756f1c><div class="curtain" data-v-e1756f1c></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-e1756f1c><span class="visually-hidden" id="sidebar-aria-label" data-v-e1756f1c> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-e1756f1c><section class="VPSidebarItem level-0 collapsible" data-v-e1756f1c data-v-b147bcc8><div class="item" role="button" tabindex="0" data-v-b147bcc8><div class="indicator" data-v-b147bcc8></div><h2 class="text" data-v-b147bcc8>开始阅读</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-b147bcc8><span class="vpi-chevron-right caret-icon" data-v-b147bcc8></span></div></div><div class="items" data-v-b147bcc8><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b147bcc8 data-v-b147bcc8><div class="item" data-v-b147bcc8><div class="indicator" data-v-b147bcc8></div><a class="VPLink link link" href="/long-press/guide" data-v-b147bcc8><!--[--><p class="text" data-v-b147bcc8>阅读须知</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-4c760b95 data-v-308553a0><div class="VPDoc has-sidebar has-aside" data-v-308553a0 data-v-e512d8d8><!--[--><!--]--><div class="container" data-v-e512d8d8><div class="aside" data-v-e512d8d8><div class="aside-curtain" data-v-e512d8d8></div><div class="aside-container" data-v-e512d8d8><div class="aside-content" data-v-e512d8d8><div class="VPDocAside" data-v-e512d8d8 data-v-bca3b04c><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" role="navigation" data-v-bca3b04c data-v-ff0b6666><div class="content" data-v-ff0b6666><div class="outline-marker" data-v-ff0b6666></div><div class="outline-title" role="heading" aria-level="2" data-v-ff0b6666>本页目录</div><nav aria-labelledby="doc-outline-aria-label" data-v-ff0b6666><span class="visually-hidden" id="doc-outline-aria-label" data-v-ff0b6666> Table of Contents for current page </span><ul class="VPDocOutlineItem root" data-v-ff0b6666 data-v-69d389fc><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-bca3b04c></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e512d8d8><div class="content-container" data-v-e512d8d8><!--[--><!--]--><main class="main" data-v-e512d8d8><div style="position:relative;" class="vp-doc _long-press_nodejs_semantic-release" data-v-e512d8d8><div><h1 id="semantic-release" tabindex="-1">semantic-release <a class="header-anchor" href="#semantic-release" aria-label="Permalink to &quot;semantic-release&quot;">​</a></h1><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">{</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">  &quot;scripts&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: {</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;clean&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;rm -rf node_modules/ &amp;&amp; rm -rf package-lock.json&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;storybook&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;start-storybook -p 6006&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;build-storybook&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;build-storybook&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;transpile&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;rm -rf dist &amp;&amp; babel src/Form -d dist --presets minify --copy-files&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;release&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;semantic-release --no-ci&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;commit&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;cz&quot;</span></span>
<span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">  },</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">  &quot;publishConfig&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: {</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;registry&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;https://registry.npmjs.org/&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;tag&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;latest&quot;</span></span>
<span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">  },</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">  &quot;release&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: {</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;plugins&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: [</span></span>
<span class="line"><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">      &quot;@semantic-release/commit-analyzer&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">      &quot;@semantic-release/release-notes-generator&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">      &quot;@semantic-release/changelog&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">      &quot;@semantic-release/git&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">      &quot;@semantic-release/npm&quot;</span></span>
<span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">    ],</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;branches&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: [</span></span>
<span class="line"><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">      &quot;master&quot;</span></span>
<span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">    ]</span></span>
<span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">  },</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">  &quot;devDependencies&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: {</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;@semantic-release/changelog&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;^5.0.1&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;@semantic-release/commit-analyzer&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;^8.0.1&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;@semantic-release/git&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;^9.0.0&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;@semantic-release/npm&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;^7.0.10&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;@semantic-release/release-notes-generator&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;^9.0.1&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;semantic-release&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;^17.4.0&quot;</span></span>
<span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">  }</span></span>
<span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br></div></div><p><code>semantic-release</code> 是一个用于自动化软件版本管理和发布的工具，它通过分析提交消息（commit messages）来确定新版本，并按照语义化版本（SemVer）规范自动打标签（tag）、生成发布说明（release notes）和发布新版本。要实现发布后将代码推送到私服（如 GitLab、GitHub Enterprise、Bitbucket Server 等）并打 tag 提交，你需要确保以下几个步骤：</p><ol><li><p><strong>安装与配置 semantic-release</strong></p><p>安装 <code>semantic-release</code> 作为项目依赖：</p></li></ol><div class="language-bash vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#795E26;--shiki-dark:#61AFEF;">npm</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> install</span><span style="--shiki-light:#0000FF;--shiki-dark:#D19A66;"> --save-dev</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> semantic-release</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>创建或编辑项目根目录下的配置文件，如 <code>.releaserc</code> 或 <code>release.config.js</code>，配置基本的 <code>semantic-release</code> 设置，包括插件列表和所需的环境变量。 这里假设你已经配置好用于发布到 npm 私服的 <code>@semantic-release/npm</code> 插件和其他相关插件。</p><ol start="2"><li><p><strong>配置 Git 推送与标签发布</strong></p><p>要确保 <code>semantic-release</code> 能够将代码推送到你的 Git 私服并打上 tag，你需要启用相应的插件。通常，使用 <code>@semantic-release/git</code> 插件来处理 Git 操作，如提交新版本的 <code>package.json</code> 和 <code>CHANGELOG.md</code>（如果已生成），以及打 tag。</p><p>在配置文件中添加或调整 <code>@semantic-release/git</code> 插件配置：</p></li></ol><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc 或 release.config.js</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span> &quot;plugins&quot;: [</span></span>
<span class="line"><span>	 // ... 其他插件配置 ...</span></span>
<span class="line"><span>	 [&quot;@semantic-release/git&quot;, {</span></span>
<span class="line"><span>		 &quot;assets&quot;: [&quot;package.json&quot;, &quot;CHANGELOG.md&quot;], // 要提交的文件列表</span></span>
<span class="line"><span>		 &quot;message&quot;: &quot;chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}&quot; // 提交消息模板</span></span>
<span class="line"><span>	 }],</span></span>
<span class="line"><span>	 // ... 其他插件配置 ...</span></span>
<span class="line"><span> ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><pre><code> 注意，这里的 `assets` 列表应该包含你想随新版本一起提交的文件，通常包括更新了版本号的 `package.json` 和生成的 `CHANGELOG.md`（如果适用）。`message` 参数定义了提交消息的模板，其中 `${nextRelease.version}` 和 `${nextRelease.notes}` 会被自动替换为新版本号和发布说明。
</code></pre><ol start="3"><li><p><strong>设置环境变量</strong></p><p><code>semantic-release</code> 需要一些环境变量来访问 Git 私服和 npm 私服。确保以下环境变量在运行 <code>semantic-release</code> 的环境中设置正确：</p><ul><li><code>GH_TOKEN</code> 或 <code>GL_TOKEN</code>（针对 GitHub 或 GitLab）：用于访问 Git 私服 API 的个人访问令牌（PAT），具有适当的权限（如读写仓库、创建标签）。</li><li><code>NPM_TOKEN</code> 或类似变量（取决于你的 npm 私服要求）：用于访问 npm 私服的 API 密钥，用于发布新版本包。</li></ul><p>请参照你使用的 Git 和 npm 私服的文档来获取正确的环境变量名和如何生成相应的令牌。</p></li><li><p><strong>运行 semantic-release</strong></p><p>在 CI/CD 环境中（如 GitLab CI/CD、Jenkins、Azure Pipelines 等），在适当的阶段（如成功构建后）运行 <code>semantic-release</code> 命令：</p><pre><code>    	```bash
   	 npx semantic-release
   	 ```

   	这将触发整个自动化发布流程，包括版本确定、生成发布说明、更新 `package.json`、提交更改到 Git、打 tag、发布到 npm 私服等。
</code></pre></li></ol><p>综上所述，通过配置 <code>semantic-release</code> 使用 <code>@semantic-release/git</code> 插件，并设置正确的环境变量，你可以实现发布后自动将代码推送到 Git 私服并打上对应新版本的 tag。 同时，配合 <code>@semantic-release/npm</code> 插件，新版本的软件包也会被发布到 npm 私服。 确保在 CI/CD 系统中正确配置和运行 <code>semantic-release</code> 命令即可实现全流程自动化。</p><h2 id="semantic-release如何设置发布到私有的gitlab" tabindex="-1">semantic-release如何设置发布到私有的gitlab <a class="header-anchor" href="#semantic-release如何设置发布到私有的gitlab" aria-label="Permalink to &quot;semantic-release如何设置发布到私有的gitlab&quot;">​</a></h2><p>使用 <code>semantic-release</code> 自动化发布到私有的 GitLab 仓库通常涉及以下步骤：</p><ol><li><strong>安装和配置 semantic-release</strong>：</li></ol><ul><li>在项目的根目录下，通过 npm 或 yarn 安装 semantic-release 及其所需的 GitLab 插件：</li></ul><div class="language-bash vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#795E26;--shiki-dark:#61AFEF;">npm</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> install</span><span style="--shiki-light:#0000FF;--shiki-dark:#D19A66;"> --save-dev</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> semantic-release</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> @semantic-release/gitlab</span></span>
<span class="line"><span style="--shiki-light:#008000;--shiki-dark:#7F848E;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic;"># 或</span></span>
<span class="line"><span style="--shiki-light:#795E26;--shiki-dark:#61AFEF;">yarn</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> add</span><span style="--shiki-light:#0000FF;--shiki-dark:#D19A66;"> --dev</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> semantic-release</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> @semantic-release/gitlab</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><ol start="2"><li><strong>配置 <code>.releaserc.json</code> 或 <code>.releaserc.yaml</code> 文件</strong>： 创建或编辑项目根目录下的 <code>.releaserc</code> 配置文件（JSON 或 YAML 格式皆可），添加必要的配置项以指定 GitLab 私有仓库的相关信息。以下是一个基本示例：</li></ol><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc.json</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>	&quot;plugins&quot;: [</span></span>
<span class="line"><span>		&quot;@semantic-release/commit-analyzer&quot;,</span></span>
<span class="line"><span>		&quot;@semantic-release/release-notes-generator&quot;,</span></span>
<span class="line"><span>		[&quot;@semantic-release/gitlab&quot;, {</span></span>
<span class="line"><span>			&quot;gitlabUrl&quot;: &quot;https://your-gitlab-instance.com&quot;,</span></span>
<span class="line"><span>			&quot;token&quot;: &quot;${GITLAB_TOKEN}&quot;,</span></span>
<span class="line"><span>			&quot;assets&quot;: [</span></span>
<span class="line"><span>				{&quot;path&quot;: &quot;dist/*&quot;, &quot;label&quot;: &quot;Distribution files&quot;}</span></span>
<span class="line"><span>			]</span></span>
<span class="line"><span>		}],</span></span>
<span class="line"><span>		&quot;@semantic-release/npm&quot;</span></span>
<span class="line"><span>	],</span></span>
<span class="line"><span>	&quot;branches&quot;: [&quot;main&quot;],</span></span>
<span class="line"><span>	&quot;repositoryUrl&quot;: &quot;https://your-gitlab-instance.com/your-group/your-project.git&quot;</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br></div></div><pre><code> 注意：

- `&quot;gitlabUrl&quot;`: 指定您的私有 GitLab 实例 URL。
- `&quot;token&quot;`: 使用 GitLab Personal Access Token（PAT），需具有相应的权限（如发布包、写仓库等）。这里的 `${GITLAB_TOKEN}`
	应替换为环境变量的实际名称，通常在 CI/CD 环境中通过环境变量注入。
- `&quot;assets&quot;`: （可选）指定要作为 release 资源上传的文件或目录，如编译后的包、文档等。
- `&quot;branches&quot;`: 指定 semantic-release 应监控哪些分支以触发发布。通常设置为主分支，如 `main` 或 `master`。
- `&quot;repositoryUrl&quot;`: 您项目的完整 GitLab 仓库 URL。

 如果使用 `.releaserc.yaml` 格式，内容类似：
</code></pre><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>plugins:</span></span>
<span class="line"><span>	- &#39;@semantic-release/commit-analyzer&#39;</span></span>
<span class="line"><span>	- &#39;@semantic-release/release-notes-generator&#39;</span></span>
<span class="line"><span>	- - &#39;@semantic-release/gitlab&#39;</span></span>
<span class="line"><span>	- gitlabUrl: https://your-gitlab-instance.com</span></span>
<span class="line"><span>	token: ${GITLAB_TOKEN}</span></span>
<span class="line"><span>	assets:</span></span>
<span class="line"><span>		- path: dist/*</span></span>
<span class="line"><span>		label: Distribution files</span></span>
<span class="line"><span>			- &#39;@semantic-release/npm&#39;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>branches:</span></span>
<span class="line"><span>	- main</span></span>
<span class="line"><span></span></span>
<span class="line"><span>repositoryUrl: https://your-gitlab-instance.com/your-group/your-project.git</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><ol start="3"><li><p><strong>设置环境变量</strong>： 在 CI/CD 环境（如 GitLab CI/CD）中，需要设置环境变量 <code>GITLAB_TOKEN</code>，其值为前面提到的 Personal Access Token。确保此变量在运行 semantic-release 的 CI/CD 作业中可用。</p></li><li><p><strong>配置 CI/CD Pipeline</strong>： 在 GitLab CI/CD 设置中，创建一个新的 Pipeline 或修改现有 Pipeline，添加一个阶段（stage）来运行 semantic-release。以下是一个简单的 <code>.gitlab-ci.yml</code> 示例：</p></li></ol><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>release:</span></span>
<span class="line"><span>	image: node:latest</span></span>
<span class="line"><span>	stage: release</span></span>
<span class="line"><span>	only:</span></span>
<span class="line"><span>		- main</span></span>
<span class="line"><span>	script:</span></span>
<span class="line"><span>		- npm ci</span></span>
<span class="line"><span>		- npx semantic-release</span></span>
<span class="line"><span>	environment:</span></span>
<span class="line"><span>		name: production</span></span>
<span class="line"><span>	variables:</span></span>
<span class="line"><span>		GITLAB_TOKEN: $YOUR_GITLAB_TOKEN_ENV_VARIABLE</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><p>这里：</p><pre><code>- `image`: 使用 Node.js 的 Docker 镜像来运行 semantic-release。
- `only`: 指定此作业仅在 `main` 分支变动时运行。
- `script`: 安装依赖并运行 semantic-release。
- `environment`: 可选，指定此作业关联的部署环境（如生产环境）。
- `variables`: 在此作业范围内设置环境变量。将 `$YOUR_GITLAB_TOKEN_ENV_VARIABLE` 替换为您在 GitLab CI/CD 设置中实际定义的环境变量名。
</code></pre><ol start="5"><li><strong>测试与验证</strong>： 提交更改并观察 CI/CD Pipeline 是否成功运行 semantic-release。如果一切配置正确，当满足语义化提交约定的提交推送到主分支时，semantic-release 应自动触发版本 bump、生成 changelog、发布新版本到 GitLab Package Registry（如果项目是 npm 包）或上传 release 资源，并在项目页面创建新的 Release。</li></ol><p>请根据您的具体项目需求和 GitLab 设置调整上述配置。务必查阅 <code>semantic-release</code> 和相关插件的最新文档以获取最新的配置选项和最佳实践。如果您在配置过程中遇到问题，可以查看 CI/CD 日志以获取详细的错误信息和调试线索。</p><h2 id="semantic-release如何设置发布到私有的npm仓库" tabindex="-1">semantic-release如何设置发布到私有的npm仓库 <a class="header-anchor" href="#semantic-release如何设置发布到私有的npm仓库" aria-label="Permalink to &quot;semantic-release如何设置发布到私有的npm仓库&quot;">​</a></h2><p>要使用 <code>semantic-release</code> 自动发布到私有的 npm 仓库，您需要进行以下配置步骤：</p><ol><li><strong>安装和配置 semantic-release</strong>：</li></ol><ul><li>在项目的根目录下，通过 npm 或 yarn 安装 semantic-release 及其所需的 npm 插件：</li></ul><div class="language-bash vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#795E26;--shiki-dark:#61AFEF;">npm</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> install</span><span style="--shiki-light:#0000FF;--shiki-dark:#D19A66;"> --save-dev</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> semantic-release</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> @semantic-release/npm</span></span>
<span class="line"><span style="--shiki-light:#008000;--shiki-dark:#7F848E;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic;"># 或</span></span>
<span class="line"><span style="--shiki-light:#795E26;--shiki-dark:#61AFEF;">yarn</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> add</span><span style="--shiki-light:#0000FF;--shiki-dark:#D19A66;"> --dev</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> semantic-release</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> @semantic-release/npm</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><ol start="2"><li><strong>配置 <code>.npmrc</code> 文件</strong>：</li></ol><ul><li>在项目根目录下创建或编辑 <code>.npmrc</code> 文件，添加指向私有 npm 仓库的注册表信息。假设您的私有 npm 仓库 URL 为 <code>https://your-private-npm-registry.com</code>，示例如下：</li></ul><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>registry=https://your-private-npm-registry.com/</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>如果需要身份验证，还需提供相应的认证信息，如用户名和密码（不推荐）或 <a href="https://docs.npmjs.com/creating-and-viewing-authentication-tokens" target="_blank" rel="noreferrer">npm token</a>：</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>registry=https://your-private-npm-registry.com/</span></span>
<span class="line"><span>//your-private-npm-registry.com/:_authToken=&lt;your-token&gt;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>或者，如果使用 <code>.npmrc</code> 文件中的环境变量：</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>registry=https://your-private-npm-registry.com/</span></span>
<span class="line"><span>//your-private-npm-registry.com/:_authToken=${NPM_TOKEN}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>确保将 <code>&lt;your-token&gt;</code> 替换为实际的 npm token，或将 <code>${NPM_TOKEN}</code> 替换为对应的环境变量名。这个环境变量应该在 CI/CD 环境中设置。</p><ol start="3"><li><strong>配置 <code>.releaserc.json</code> 或 <code>.releaserc.yaml</code> 文件</strong>：</li></ol><ul><li>创建或编辑项目根目录下的 <code>.releaserc</code> 配置文件（JSON 或 YAML 格式皆可），确保已包含 <code>@semantic-release/npm</code> 插件。基本配置可能如下：</li></ul><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc.json</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>&quot;plugins&quot;: [</span></span>
<span class="line"><span>	&quot;@semantic-release/commit-analyzer&quot;,</span></span>
<span class="line"><span>	&quot;@semantic-release/release-notes-generator&quot;,</span></span>
<span class="line"><span>	&quot;@semantic-release/npm&quot;</span></span>
<span class="line"><span>],</span></span>
<span class="line"><span>&quot;branches&quot;: [&quot;main&quot;]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>或</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span># .releaserc.yaml</span></span>
<span class="line"><span>plugins:</span></span>
<span class="line"><span>	- &#39;@semantic-release/commit-analyzer&#39;</span></span>
<span class="line"><span>	- &#39;@semantic-release/release-notes-generator&#39;</span></span>
<span class="line"><span>	- &#39;@semantic-release/npm&#39;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>branches:</span></span>
<span class="line"><span>	- main</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>这里：</p><ul><li><code>&quot;branches&quot;</code>: 指定 semantic-release 应监控哪些分支以触发发布。通常设置为主分支，如 <code>main</code> 或 <code>master</code>。</li></ul><ol start="4"><li><p><strong>设置环境变量</strong>：</p><ul><li>在 CI/CD 环境（如 GitLab CI/CD, Travis CI, CircleCI, etc.）中，设置环境变量 <code>NPM_TOKEN</code>，其值为前面提到的 npm token。确保此变量在运行 semantic-release 的 CI/CD 作业中可用。</li></ul></li><li><p><strong>配置 CI/CD Pipeline</strong>：</p></li></ol><ul><li>在您使用的 CI/CD 平台中，创建一个新的 Pipeline 或修改现有 Pipeline，添加一个阶段（stage）来运行 semantic-release。以下是一个简单的示例：</li></ul><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>release:</span></span>
<span class="line"><span>	image: node:latest</span></span>
<span class="line"><span>	stage: release</span></span>
<span class="line"><span>	only:</span></span>
<span class="line"><span>		- main</span></span>
<span class="line"><span>	script:</span></span>
<span class="line"><span>		- npm ci</span></span>
<span class="line"><span>		- npx semantic-release</span></span>
<span class="line"><span>	environment:</span></span>
<span class="line"><span>		name: production</span></span>
<span class="line"><span>	env:</span></span>
<span class="line"><span>		NPM_TOKEN: $YOUR_NPM_TOKEN_ENV_VARIABLE</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><p>这里：</p><ul><li><code>image</code>: 使用 Node.js 的 Docker 镜像来运行 semantic-release。</li><li><code>only</code>: 指定此作业仅在 <code>main</code> 分支变动时运行。</li><li><code>script</code>: 安装依赖并运行 semantic-release。</li><li><code>environment</code>: 可选，指定此作业关联的部署环境（如生产环境）。</li><li><code>env</code>: 在此作业范围内设置环境变量。将 <code>$YOUR_NPM_TOKEN_ENV_VARIABLE</code> 替换为您在 CI/CD 设置中实际定义的环境变量名。</li></ul><ol start="6"><li><strong>测试与验证</strong>： <ul><li>提交更改并观察 CI/CD Pipeline 是否成功运行 semantic-release。如果一切配置正确，当满足语义化提交约定的提交推送到主分支时，semantic-release 应自动触发版本 bump、生成 changelog、发布新版本到私有 npm 仓库。</li></ul></li></ol><p>请根据您的具体项目需求和 CI/CD 平台设置调整上述配置。务必查阅 <code>semantic-release</code> 和相关插件的最新文档以获取最新的配置选项和最佳实践。如果您在配置过程中遇到问题，可以查看 CI/CD 日志以获取详细的错误信息和调试线索。</p><h2 id="semantic-release内网使用最佳实践" tabindex="-1">semantic-release内网使用最佳实践 <a class="header-anchor" href="#semantic-release内网使用最佳实践" aria-label="Permalink to &quot;semantic-release内网使用最佳实践&quot;">​</a></h2><p>在内网环境中使用 <code>semantic-release</code> 进行自动化版本管理和发布时，需要克服无法直接访问公网服务（如 GitHub、GitLab、npm registry 等）的限制。以下是一些内网使用 <code>semantic-release</code> 的最佳实践：</p><ol><li><p><strong>搭建私有 Git 服务器</strong>： 在内网环境中部署一套私有的 Git 服务器，如 GitLab 社区版、Gitea、Gogs 等。将项目仓库迁移到私有 Git 服务器上，确保 <code>semantic-release</code> 能够访问到所需的 Git 数据。</p></li><li><p><strong>配置私有 npm registry</strong>： 如果内网环境中已有私有 npm registry（如 Nexus、Artifactory、Verdaccio 等），确保项目使用该私有 registry，并在 <code>package.json</code> 中通过 <code>publishConfig.registry</code> 指定发布地址：</p></li></ol><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">{</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">  &quot;name&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;my-package&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">  &quot;version&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;1.0.0&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">,</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">  &quot;publishConfig&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: {</span></span>
<span class="line"><span style="--shiki-light:#0451A5;--shiki-dark:#E06C75;">    &quot;registry&quot;</span><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">: </span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;">&quot;http://your-private-npm-registry-url&quot;</span></span>
<span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">  }</span></span>
<span class="line"><span style="--shiki-light:#000000;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><pre><code>  	如果尚未搭建私有 npm registry，考虑部署一个适合内网环境的 registry 服务。
</code></pre><ol start="3"><li><p><strong>配置 CI/CD 系统</strong>： 在内网的持续集成/持续部署（CI/CD）系统中（如 Jenkins、GitLab CI/CD、JFrog Pipelines 等），为项目配置构建任务。确保 CI/CD 系统能够访问 Git 服务器和私有 npm registry。</p></li><li><p><strong>配置 <code>semantic-release</code></strong>： 在项目根目录下创建 <code>.releaserc</code> 或 <code>release.config.js</code> 文件，配置 <code>semantic-release</code> 以适应内网环境：</p></li></ol><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>	&quot;repositoryUrl&quot;: &quot;http://your-private-git-server/user/repo.git&quot;,</span></span>
<span class="line"><span>	&quot;plugins&quot;: [</span></span>
<span class="line"><span>		[</span></span>
<span class="line"><span>			&quot;@semantic-release/commit-analyzer&quot;,</span></span>
<span class="line"><span>			{</span></span>
<span class="line"><span>				&quot;preset&quot;: &quot;angular&quot;,</span></span>
<span class="line"><span>				&quot;releaseRules&quot;: [</span></span>
<span class="line"><span>					{</span></span>
<span class="line"><span>						&quot;type&quot;: &quot;docs&quot;,</span></span>
<span class="line"><span>						&quot;scope&quot;: &quot;*&quot;,</span></span>
<span class="line"><span>						&quot;release&quot;: &quot;patch&quot;</span></span>
<span class="line"><span>					}</span></span>
<span class="line"><span>					// ...additional rules if needed</span></span>
<span class="line"><span>				]</span></span>
<span class="line"><span>			}</span></span>
<span class="line"><span>		],</span></span>
<span class="line"><span>		&quot;@semantic-release/release-notes-generator&quot;,</span></span>
<span class="line"><span>		[</span></span>
<span class="line"><span>			&quot;@semantic-release/npm&quot;,</span></span>
<span class="line"><span>			{</span></span>
<span class="line"><span>				&quot;npmPublish&quot;: true,</span></span>
<span class="line"><span>				&quot;tarballDir&quot;: &quot;./dist&quot;</span></span>
<span class="line"><span>				// If necessary, specify the tarball directory</span></span>
<span class="line"><span>			}</span></span>
<span class="line"><span>		]</span></span>
<span class="line"><span>		// ...other plugins for deployment, notifications, etc.</span></span>
<span class="line"><span>	]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br></div></div><pre><code>- `repositoryUrl`: 指定私有 Git 服务器上的项目仓库 URL。
- `plugins`: 配置所需插件。确保包含 `@semantic-release/npm` 插件，并设置 `npmPublish: true` 以发布到私有 npm registry。
</code></pre><ol start="5"><li><p><strong>授权 CI/CD 系统访问 Git 和 npm</strong>： 为 CI/CD 系统的构建用户或服务账户配置适当的 Git 访问权限（如读取仓库、创建标签、推送等）。同样，为该账户在私有 npm registry 中配置发布权限。</p></li><li><p><strong>触发发布流程</strong>： 在 CI/CD 系统中，配置触发 <code>semantic-release</code> 的条件。通常是在特定分支（如 <code>master</code> 或 <code>main</code> ）接收到合并请求后，自动触发构建任务并执行 <code>semantic-release</code>。</p></li><li><p><strong>监控和日志</strong>： 确保 CI/CD 系统提供详细的日志输出，以便在 <code>semantic-release</code> 运行过程中发现问题。同时，配置适当的监控和通知机制（如 Slack、邮件通知等），以便及时了解发布状态。</p></li><li><p><strong>测试发布流程</strong>： 在实际应用 <code>semantic-release</code> 之前，先在测试项目或环境中完整演练一次发布流程，确保各个环节（Git 操作、npm 发布、通知等）均能正常工作。</p></li></ol><p>遵循以上最佳实践，可以在内网环境中顺利使用 <code>semantic-release</code> 实现项目的自动化版本管理和发布。尽管需要额外配置私有 Git 服务器、npm registry 和 CI/CD 系统，但这些投入将带来长期的版本管理便利性和规范性。</p><h2 id="semantic-release如何自定义发布的版本号" tabindex="-1">semantic-release如何自定义发布的版本号 <a class="header-anchor" href="#semantic-release如何自定义发布的版本号" aria-label="Permalink to &quot;semantic-release如何自定义发布的版本号&quot;">​</a></h2><p><code>semantic-release</code> 旨在自动根据项目提交历史中的语义化 commit 信息来确定并发布新版本。它遵循 <a href="https://www.conventionalcommits.org/" target="_blank" rel="noreferrer">Conventional Commits</a> 规范，通过分析 commit 类型（如 <code>fix</code>, <code>feat</code>, <code>chore</code>, etc.）和附带的 <code>BREAKING CHANGE</code> 注释来决定版本号的递增规则（patch, minor, or major）。然而，有时候您可能希望在遵循语义化版本控制（SemVer）原则的同时，对发布的版本号进行一些自定义。以下是一些方法来实现这一目标：</p><h3 id="方法-1-使用-semantic-release-git-插件的-message-选项" tabindex="-1"><strong>方法 1: 使用 <code>@semantic-release/git</code> 插件的 <code>message</code> 选项</strong> <a class="header-anchor" href="#方法-1-使用-semantic-release-git-插件的-message-选项" aria-label="Permalink to &quot;**方法 1: 使用 `@semantic-release/git` 插件的 `message` 选项**&quot;">​</a></h3><p>如果您只是想在最终发布的 Git tag 上添加一些额外信息（不影响 npm package 的版本），可以利用 <code>@semantic-release/git</code> 插件的 <code>message</code> 选项来定制 tag 的格式。例如，在 <code>.releaserc</code> 文件中添加：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    // ...</span></span>
<span class="line"><span>    [&quot;@semantic-release/git&quot;, {</span></span>
<span class="line"><span>      &quot;assets&quot;: [&quot;package.json&quot;],</span></span>
<span class="line"><span>      &quot;message&quot;: &quot;chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}&quot;</span></span>
<span class="line"><span>    }]</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>这里的 <code>${nextRelease.version}</code> 和 <code>${nextRelease.notes}</code> 是 <code>semantic-release</code> 提供的模板变量，它们会被实际的版本号和变更日志替换。您可以根据需要调整这个 <code>message</code> 字符串。</p><h3 id="方法-2-使用-semantic-release-exec-插件执行自定义脚本" tabindex="-1"><strong>方法 2: 使用 <code>@semantic-release/exec</code> 插件执行自定义脚本</strong> <a class="header-anchor" href="#方法-2-使用-semantic-release-exec-插件执行自定义脚本" aria-label="Permalink to &quot;**方法 2: 使用 `@semantic-release/exec` 插件执行自定义脚本**&quot;">​</a></h3><p>如果您需要在发布过程中对版本号进行更复杂的处理，可以使用 <code>@semantic-release/exec</code> 插件来执行自定义脚本。例如，您可以在发布流程中增加一个步骤，用脚本来修改 <code>package.json</code> 中的版本号。在 <code>.releaserc</code> 中配置如下：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    // ...</span></span>
<span class="line"><span>    [&quot;@semantic-release/exec&quot;, {</span></span>
<span class="line"><span>      &quot;prepareCmd&quot;: &quot;node ./scripts/customize-version.js ${nextRelease.version}&quot;</span></span>
<span class="line"><span>    }]</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>这里的 <code>customize-version.js</code> 是您自定义的 JavaScript 脚本，它接收 <code>nextRelease.version</code> 作为参数，并可以对其进行修改后写回 <code>package.json</code>。确保该脚本在执行完后，<code>package.json</code> 中的版本号符合预期。</p><h3 id="方法-3-使用-semantic-release-release-notes-generator-的-preset-或-writeropts" tabindex="-1"><strong>方法 3: 使用 <code>@semantic-release/release-notes-generator</code> 的 <code>preset</code> 或 <code>writerOpts</code></strong> <a class="header-anchor" href="#方法-3-使用-semantic-release-release-notes-generator-的-preset-或-writeropts" aria-label="Permalink to &quot;**方法 3: 使用 `@semantic-release/release-notes-generator` 的 `preset` 或 `writerOpts`**&quot;">​</a></h3><p>如果您想改变生成的 release notes 中版本号的呈现方式，可以配置 <code>@semantic-release/release-notes-generator</code> 插件。例如：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    // ...</span></span>
<span class="line"><span>    [&quot;@semantic-release/release-notes-generator&quot;, {</span></span>
<span class="line"><span>      &quot;preset&quot;: &quot;custom-preset&quot;, // 使用自定义的 preset，需在项目中定义</span></span>
<span class="line"><span>      &quot;writerOpts&quot;: {</span></span>
<span class="line"><span>        &quot;header&quot;: &quot;# ${nextRelease.version} (${nextRelease.gitTag}) - ${nextRelease.publishedAt}\n\n${nextRelease.notes}&quot;</span></span>
<span class="line"><span>      }</span></span>
<span class="line"><span>    }]</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><p>这里的 <code>preset</code> 可以引用一个自定义的预设，用于完全控制 release notes 的生成逻辑。<code>writerOpts</code> 则允许您微调 release notes 的头部格式。</p><h3 id="方法-4-使用自定义的-analyzecommits-插件" tabindex="-1"><strong>方法 4: 使用自定义的 <code>analyzeCommits</code> 插件</strong> <a class="header-anchor" href="#方法-4-使用自定义的-analyzecommits-插件" aria-label="Permalink to &quot;**方法 4: 使用自定义的 `analyzeCommits` 插件**&quot;">​</a></h3><p>如果您需要从根本上改变版本号计算规则，可以编写一个自定义的 <code>analyzeCommits</code> 插件来替代默认的行为。这是一个高级且复杂的方法，需要深入理解 <code>semantic-release</code> 的内部工作原理。 您可以在自定义插件中完全控制如何解析 commit 信息并确定版本号。</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    // ...</span></span>
<span class="line"><span>    [&quot;my-custom-analyze-commits-plugin&quot;, {</span></span>
<span class="line"><span>      // 自定义配置项</span></span>
<span class="line"><span>    }]</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>请确保自定义插件遵循 <code>semantic-release</code> 插件接口，并正确导出 <code>analyzeCommits</code> 函数。</p><p>总的来说，<code>semantic-release</code> 提供了多种途径来适应不同的自定义需求。选择合适的方法取决于您具体想对版本号进行何种程度和类型的定制。 在进行自定义时，仍需确保最终生成的版本号遵循 SemVer 原则，以便其他依赖您的项目的开发者能够理解和预期版本变化。</p><h2 id="semantic-release如何发布beta的版本号" tabindex="-1">semantic-release如何发布beta的版本号 <a class="header-anchor" href="#semantic-release如何发布beta的版本号" aria-label="Permalink to &quot;semantic-release如何发布beta的版本号&quot;">​</a></h2><p><code>semantic-release</code> 通过识别提交消息中的特定关键字和格式来自动确定新版本的类型（patch, minor, major），并根据这些类型来生成相应的正式版本。若要发布带有 beta 标记的预发布版本（如 beta、rc、alpha 等），您需要按照 <code>Conventional Commits</code> 规范在提交消息中包含特定的预发布标签。以下是使用 <code>semantic-release</code> 发布 beta 版本的具体步骤：</p><h3 id="步骤-1-配置-releaserc-或-release-config-js" tabindex="-1"><strong>步骤 1: 配置 <code>.releaserc</code> 或 <code>release.config.js</code></strong> <a class="header-anchor" href="#步骤-1-配置-releaserc-或-release-config-js" aria-label="Permalink to &quot;**步骤 1: 配置 `.releaserc` 或 `release.config.js`**&quot;">​</a></h3><p>确保您的项目配置文件（通常是 <code>.releaserc</code> 或 <code>release.config.js</code>）已经正确设置，以便 <code>semantic-release</code> 能够识别并处理预发布版本。基本配置可能如下所示：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>  &quot;branches&quot;: [&quot;main&quot;, { &quot;name&quot;: &quot;beta&quot;, &quot;prerelease&quot;: true }],</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    &quot;@semantic-release/commit-analyzer&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/release-notes-generator&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/changelog&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/npm&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/github&quot;</span></span>
<span class="line"><span>    // 其他插件...</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><p>这里的关键点是设置了 <code>&quot;prerelease&quot;: true</code> 对于名为 &quot;beta&quot; 的分支。这意味着在这个分支上的任何发布都会被视为预发布版本。您也可以根据需要调整分支名称。</p><h3 id="步骤-2-按照-conventional-commits-规范编写提交消息" tabindex="-1"><strong>步骤 2: 按照 Conventional Commits 规范编写提交消息</strong> <a class="header-anchor" href="#步骤-2-按照-conventional-commits-规范编写提交消息" aria-label="Permalink to &quot;**步骤 2: 按照 Conventional Commits 规范编写提交消息**&quot;">​</a></h3><p>为了触发 beta 版本的发布，您需要在提交消息中包含预发布标签。根据 <code>Conventional Commits</code> 规范，这通常通过在提交类型（如 <code>feat</code>、<code>fix</code> 等）后附加括号内包含预发布标签的方式来实现。例如：</p><div class="language-bash vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#795E26;--shiki-dark:#61AFEF;">git</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> commit</span><span style="--shiki-light:#0000FF;--shiki-dark:#D19A66;"> -m</span><span style="--shiki-light:#A31515;--shiki-dark:#98C379;"> &quot;feat: Add new feature (beta)&quot;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>这里，“(beta)” 表示这是一个针对新功能的 beta 版本提交。其他常见的预发布标签包括 <code>alpha</code>、<code>rc</code>、<code>next</code> 等，您可以根据项目需求选择合适的标签。</p><h3 id="步骤-3-触发-semantic-release-运行" tabindex="-1"><strong>步骤 3: 触发 <code>semantic-release</code> 运行</strong> <a class="header-anchor" href="#步骤-3-触发-semantic-release-运行" aria-label="Permalink to &quot;**步骤 3: 触发 `semantic-release` 运行**&quot;">​</a></h3><p>确保您的 CI/CD 系统（如 GitHub Actions、GitLab CI、CircleCI 等）已配置好，当您推送到 beta 分支时会自动运行 <code>semantic-release</code> 。如果您手动管理发布流程，可以在 beta 分支上执行 <code>npx semantic-release</code> 命令来启动发布过程。</p><h3 id="步骤-4-semantic-release-处理预发布版本" tabindex="-1"><strong>步骤 4: <code>semantic-release</code> 处理预发布版本</strong> <a class="header-anchor" href="#步骤-4-semantic-release-处理预发布版本" aria-label="Permalink to &quot;**步骤 4: `semantic-release` 处理预发布版本**&quot;">​</a></h3><p><code>semantic-release</code> 会识别出提交消息中的预发布标签，并据此生成相应的 beta 版本号。例如，假设当前正式版本为 <code>1.2.3</code>，那么一个新的 beta 版本可能会被标记为 <code>1.2.4-beta.0</code>。这个版本号将用于生成新的 Git tag、更新 <code>CHANGELOG.md</code>、发布到 npm registry（如果适用），以及在 GitHub（或其他代码托管平台）上创建对应的 release。</p><h3 id="后续版本迭代" tabindex="-1"><strong>后续版本迭代</strong> <a class="header-anchor" href="#后续版本迭代" aria-label="Permalink to &quot;**后续版本迭代**&quot;">​</a></h3><p>随着 beta 版本的迭代，每次新的带有 beta 标签的提交都会导致版本号递增。例如，第二个 beta 版本可能会是 <code>1.2.4-beta.1</code> ，以此类推。当您准备发布正式版本时，只需在没有预发布标签的提交上触发 <code>semantic-release</code> ，它会基于这些提交生成正式版本（如 <code>1.2.4</code>）。</p><p>通过遵循上述步骤，您就可以利用 <code>semantic-release</code> 自动发布带有 beta 标记的版本，同时保持对正式版本发布的控制。这样不仅有助于您在正式发布前收集用户反馈和进行 bug 修复，还能确保版本管理遵循语义化版本控制（SemVer）原则。</p><h2 id="semantic-release-release-notes-generator详细介绍" tabindex="-1">@semantic-release/release-notes-generator详细介绍 <a class="header-anchor" href="#semantic-release-release-notes-generator详细介绍" aria-label="Permalink to &quot;@semantic-release/release-notes-generator详细介绍&quot;">​</a></h2><p><strong>@semantic-release/release-notes-generator</strong> 是 <code>semantic-release</code> 生态系统中的一个核心插件，负责生成每个新版本的发布说明（Release Notes）。这些发布说明提供了关于版本变更的详细信息，包括引入的新功能、修复的错误、性能改进等，这对于向项目用户、贡献者和维护者清晰地传达版本更新内容至关重要。以下是该插件的详细介绍：</p><h3 id="主要功能" tabindex="-1"><strong>主要功能</strong> <a class="header-anchor" href="#主要功能" aria-label="Permalink to &quot;**主要功能**&quot;">​</a></h3><ul><li><p><strong>解析提交历史</strong>：基于 <code>Conventional Commits</code> 规范解析项目提交历史，识别出不同类型的提交（如 <code>feat</code>、<code>fix</code>、<code>perf</code>、<code>docs</code>、<code>chore</code> 等）及其关联的描述和影响范围（如 <code>BREAKING CHANGE</code>）。</p></li><li><p><strong>生成发布说明</strong>：根据解析出的提交信息，构建一个结构化的、易于阅读的发布说明文档。文档通常包含以下几个部分：</p><ul><li><strong>版本标题</strong>：新版本的完整 SemVer 格式标识（如 <code>v1.2.3</code> 或 <code>v2.0.0-beta.1</code>）。</li><li><strong>日期</strong>：发布日期。</li><li><strong>变更列表</strong>：按类别分组的提交摘要，如“Features”、“Bug Fixes”、“Performance Improvements”、“Breaking Changes”等。每个类别下列出相关提交的简短描述，有时还会包含关联的 issue 或 pull request 编号（如果在提交消息中指定了）。</li></ul></li><li><p><strong>支持模板定制</strong>：允许用户自定义发布说明的输出格式和内容，通过配置选项指定一个自定义模板文件或使用内置模板引擎（如 EJS）提供的变量和函数。</p></li></ul><h3 id="配置与使用" tabindex="-1"><strong>配置与使用</strong> <a class="header-anchor" href="#配置与使用" aria-label="Permalink to &quot;**配置与使用**&quot;">​</a></h3><p>在项目的 <code>semantic-release</code> 配置文件（如 <code>.releaserc</code> 或 <code>release.config.js</code> ）中，<code>@semantic-release/release-notes-generator</code> 通常作为必需的插件被包含在 <code>plugins</code> 数组中：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    &quot;@semantic-release/commit-analyzer&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/release-notes-generator&quot;, // 在此处指定</span></span>
<span class="line"><span>    &quot;@semantic-release/changelog&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/npm&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/github&quot;</span></span>
<span class="line"><span>    // 其他插件...</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h4 id="配置选项" tabindex="-1"><strong>配置选项</strong> <a class="header-anchor" href="#配置选项" aria-label="Permalink to &quot;**配置选项**&quot;">​</a></h4><p>该插件接受一些可选的配置参数来定制发布说明的生成方式：</p><ul><li><p><strong>preset</strong>: 指定一个预设模板，如 <code>angular</code>、<code>conventionalcommits</code>、<code>jshint</code>、<code>eslint</code> 等。默认值为 <code>conventionalcommits</code>。</p></li><li><p><strong>writerOpts</strong>: 用于定制输出格式的选项，可以包括以下子选项：</p><ul><li><p><strong>transform</strong>: 函数，接收一个提交对象作为参数，返回经过转换的提交对象，可用于自定义提交消息的呈现方式。</p></li><li><p><strong>groupBy</strong>: 字符串或函数，用于决定如何将提交分组。默认按提交类型（如 <code>feat</code>、<code>fix</code> 等）进行分组。</p></li><li><p><strong>commitGroupsSort</strong>: 函数，用于排序分组后的提交列表。默认按提交类型的字母顺序排序。</p></li><li><p><strong>notesGroupsSort</strong>: 函数，用于排序每个分组内部的提交列表。默认按提交时间的逆序排序。</p></li><li><p><strong>render</strong>: 函数，接收一个已解析和格式化的提交数据对象，返回最终的字符串形式的发布说明。</p></li></ul></li><li><p><strong>template</strong>: 字符串或对象，用于指定自定义模板文件路径或直接提供模板内容。如果使用对象形式，键为模板引擎（如 <code>ejs</code> ），值为模板内容。</p></li></ul><h4 id="自定义模板" tabindex="-1"><strong>自定义模板</strong> <a class="header-anchor" href="#自定义模板" aria-label="Permalink to &quot;**自定义模板**&quot;">​</a></h4><p>如果您想完全控制发布说明的样式和内容，可以创建一个自定义模板文件。例如，创建一个名为 <code>custom-template.hbs</code> 的 Handlebars 模板文件，然后在配置中指定：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    // ...</span></span>
<span class="line"><span>    [&quot;@semantic-release/release-notes-generator&quot;, {</span></span>
<span class="line"><span>      &quot;preset&quot;: &quot;angular&quot;,</span></span>
<span class="line"><span>      &quot;template&quot;: &quot;path/to/custom-template.hbs&quot;</span></span>
<span class="line"><span>    }]</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><p>在模板文件中，您可以使用插件提供的上下文数据（如 <code>version</code>、<code>commits</code>、<code>repositoryUrl</code> 等）来构建所需的输出格式。</p><h3 id="总结" tabindex="-1"><strong>总结</strong> <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;**总结**&quot;">​</a></h3><p><code>@semantic-release/release-notes-generator</code> 是 <code>semantic-release</code> 工作流中的重要一环，它负责将符合 <code>Conventional Commits</code> 规范的提交历史转化为清晰、结构化的发布说明文档。 通过灵活的配置选项和模板支持，开发团队可以根据项目需求和偏好定制发布说明的生成方式，确保向社区提供有价值且易于理解的版本更新信息。</p><h2 id="semantic-release-commit-analyzer详细介绍" tabindex="-1">@semantic-release/commit-analyzer详细介绍 <a class="header-anchor" href="#semantic-release-commit-analyzer详细介绍" aria-label="Permalink to &quot;@semantic-release/commit-analyzer详细介绍&quot;">​</a></h2><p><strong>@semantic-release/commit-analyzer</strong> 是 <code>semantic-release</code> 工具链中的一个重要插件，负责分析项目提交历史并确定是否应触发新的软件版本发布以及新版本的具体类型（如 <code>patch</code>、<code>minor</code> 或 <code>major</code>）。该插件遵循 <code>Conventional Commits</code> 规范，通过解析提交消息中的关键词、类型、描述和注释来判断每次提交对项目公共 API 的影响程度。以下是 <code>@semantic-release/commit-analyzer</code> 的详细介绍：</p><h3 id="主要功能-1" tabindex="-1"><strong>主要功能</strong> <a class="header-anchor" href="#主要功能-1" aria-label="Permalink to &quot;**主要功能**&quot;">​</a></h3><ul><li><p><strong>解析提交消息</strong>：根据 <code>Conventional Commits</code> 规范分析提交消息结构，识别提交类型（如 <code>feat</code>、<code>fix</code>、<code>perf</code>、<code>docs</code>、<code>chore</code> 等）、描述、可选的 <code>BREAKING CHANGE</code> 注释，以及可能存在的 <code>scope</code>（影响范围）。</p></li><li><p><strong>确定版本类型</strong>：基于解析出的提交信息，应用预设的规则或自定义策略来确定新版本应为 <code>patch</code>、<code>minor</code> 还是 <code>major</code>：</p><ul><li><p><strong>patch (PATCH)</strong>：当提交包含 <code>fix</code> 类型或标记为 <code>fix</code> 的 <code>BREAKING CHANGE</code> 时，通常会触发 <code>patch</code> 版本发布，用于修复 bug 或小范围的功能改进，不涉及公共 API 的兼容性变化。</p></li><li><p><strong>minor (MINOR)</strong>：当提交包含 <code>feat</code> 类型或标记为 <code>feat</code> 的 <code>BREAKING CHANGE</code> 时，会触发 <code>minor</code> 版本发布，表示添加了新功能但保持了向后兼容性。</p></li><li><p><strong>major (MAJOR)</strong>：当提交包含明确标记为 <code>BREAKING CHANGE</code> 的注释（无论提交类型如何），或者使用了自定义规则定义的其他触发条件时，会触发 <code>major</code> 版本发布，表示存在不兼容的公共 API 变更。</p></li></ul></li><li><p><strong>处理预发布版本</strong>：支持识别和处理预发布版本（如 <code>alpha</code>、<code>beta</code>、<code>rc</code> 等），根据提交内容和配置决定是否继续发布预发布版本或转为正式版本。</p></li><li><p><strong>自定义规则与配置</strong>：允许用户通过配置文件定义额外的发布规则、忽略某些提交类型、设置特定提交类型触发特定版本类型等。</p></li></ul><h3 id="配置与使用-1" tabindex="-1"><strong>配置与使用</strong> <a class="header-anchor" href="#配置与使用-1" aria-label="Permalink to &quot;**配置与使用**&quot;">​</a></h3><p>在 <code>semantic-release</code> 的配置文件（如 <code>.releaserc</code> 或 <code>release.config.js</code>）中，<code>@semantic-release/commit-analyzer</code> 通常是第一个执行的插件：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    &quot;@semantic-release/commit-analyzer&quot;, // 在此处指定</span></span>
<span class="line"><span>    &quot;@semantic-release/release-notes-generator&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/changelog&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/npm&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/github&quot;</span></span>
<span class="line"><span>    // 其他插件...</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h4 id="配置选项-1" tabindex="-1"><strong>配置选项</strong> <a class="header-anchor" href="#配置选项-1" aria-label="Permalink to &quot;**配置选项**&quot;">​</a></h4><p>该插件接受一系列配置参数以适应不同的项目需求和版本控制策略：</p><ul><li><p><strong>preset</strong>: 字符串，指定一个预设的规则集，如 <code>angular</code>、<code>conventionalcommits</code>、<code>jshint</code>、<code>eslint</code> 等。预设包含了对特定类型提交如何影响版本号的基本规则。默认值为 <code>conventionalcommits</code>。</p></li><li><p><strong>releaseRules</strong>: 数组，用于覆盖或扩展预设规则，定义特定提交类型或正则表达式匹配的提交消息如何影响版本。每个规则包含 <code>type</code> （提交类型或正则表达式）、<code>release</code>（要触发的版本类型）和可选的 <code>scope</code>（影响范围）。</p></li><li><p><strong>parserPreset</strong>: 字符串或对象，指定解析提交消息使用的预设，与 <code>preset</code> 类似，但针对的是解析器而不是发布规则。例如，可以指定 <code>conventionalcommits-parser</code> 预设。</p></li><li><p><strong>analyzeCommits</strong>: 函数，允许完全自定义提交分析逻辑。接收一个解析后的提交数组和当前版本作为参数，返回一个包含 <code>type</code>、<code>channel</code>（如 <code>stable</code> 或 <code>pre</code>）的对象，用于决定新版本类型和是否为预发布版本。</p></li><li><p><strong>ignoreReverted</strong>: 布尔值，指示是否忽略已被 revert 的提交。默认值为 <code>true</code>。</p></li></ul><h4 id="示例配置" tabindex="-1"><strong>示例配置</strong> <a class="header-anchor" href="#示例配置" aria-label="Permalink to &quot;**示例配置**&quot;">​</a></h4><p>以下是一个包含自定义发布规则的示例配置：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    [&quot;@semantic-release/commit-analyzer&quot;, {</span></span>
<span class="line"><span>      &quot;preset&quot;: &quot;conventionalcommits&quot;,</span></span>
<span class="line"><span>      &quot;releaseRules&quot;: [</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;docs&quot;, &quot;release&quot;: &quot;patch&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;style&quot;, &quot;release&quot;: &quot;patch&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;refactor&quot;, &quot;release&quot;: &quot;patch&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;perf&quot;, &quot;release&quot;: &quot;patch&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;test&quot;, &quot;release&quot;: &quot;patch&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;ci&quot;, &quot;release&quot;: &quot;patch&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;chore&quot;, &quot;release&quot;: &quot;patch&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;build&quot;, &quot;release&quot;: &quot;patch&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;revert&quot;, &quot;release&quot;: &quot;patch&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;feat&quot;, &quot;release&quot;: &quot;minor&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;fix&quot;, &quot;release&quot;: &quot;patch&quot;},</span></span>
<span class="line"><span>        {&quot;type&quot;: &quot;BREAKING CHANGE&quot;, &quot;release&quot;: &quot;major&quot;}</span></span>
<span class="line"><span>      ]</span></span>
<span class="line"><span>    }],</span></span>
<span class="line"><span>    // 其他插件...</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br></div></div><p>在这个例子中，我们指定了 <code>conventionalcommits</code> 预设，并进一步细化了每个提交类型的版本影响。例如，所有的 <code>docs</code>、<code>style</code>、<code>refactor</code> 等类型的提交都被映射到 <code>patch</code> 版本发布，而 <code>feat</code> 类型提交触发 <code>minor</code> 版本，包含 <code>BREAKING CHANGE</code> 的提交触发 <code>major</code> 版本。</p><h3 id="总结-1" tabindex="-1"><strong>总结</strong> <a class="header-anchor" href="#总结-1" aria-label="Permalink to &quot;**总结**&quot;">​</a></h3><p><code>@semantic-release/commit-analyzer</code> 在 <code>semantic-release</code> 自动化发布流程中扮演关键角色，通过解析提交消息并应用版本控制策略，确定何时以及如何发布新版本。 通过灵活的配置选项，开发者可以定制适合自身项目的提交分析规则，确保版本发布的准确性和一致性，同时与 <code>Conventional Commits</code> 规范保持良好兼容，便于团队成员理解和遵循。</p><h2 id="semantic-release-git详细说明" tabindex="-1">@semantic-release/git详细说明 <a class="header-anchor" href="#semantic-release-git详细说明" aria-label="Permalink to &quot;@semantic-release/git详细说明&quot;">​</a></h2><p><strong>@semantic-release/git</strong> 是 <code>semantic-release</code> 生态系统中的一个插件，主要用于在发布新版本时自动更新项目的 Git 标签和相关的文件（如 <code>package.json</code>、<code>CHANGELOG.md</code> 等）。该插件确保了版本控制系统的状态与实际发布的软件版本保持一致，方便其他开发者或自动化工具通过 Git 标签追踪项目的历史版本。以下是 <code>@semantic-release/git</code> 的详细说明：</p><h3 id="主要功能-2" tabindex="-1"><strong>主要功能</strong> <a class="header-anchor" href="#主要功能-2" aria-label="Permalink to &quot;**主要功能**&quot;">​</a></h3><ul><li><p><strong>创建 Git 标签</strong>：基于 <code>semantic-release</code> 确定的新版本号，创建一个对应的 Git 标签（如 <code>v1.2.3</code> ），并将标签推送到远程仓库。标签是永久性的，代表了一个特定的提交（通常是合并到主分支的发布分支点），并关联了对应的发布版本。</p></li><li><p><strong>更新版本文件</strong>：如果配置中指定了项目内的文件需要更新版本号，如 <code>package.json</code>、<code>bower.json</code>、<code>package-lock.json</code> 等，插件会自动将这些文件中的 <code>version</code> 字段更新为新版本。</p></li><li><p><strong>提交与推送变更</strong>：将上述更新（创建标签和版本文件变更）作为一次新的 Git 提交，并将这次提交推送到远程仓库。提交消息通常包含版本信息和变更日志摘要，便于其他开发者通过 Git 日志快速了解版本更新内容。</p></li><li><p><strong>支持自定义</strong>：允许用户通过配置选项指定要更新的文件列表、自定义提交消息格式、是否跳过 CI/CD 系统的后续构建步骤等。</p></li></ul><h3 id="配置与使用-2" tabindex="-1"><strong>配置与使用</strong> <a class="header-anchor" href="#配置与使用-2" aria-label="Permalink to &quot;**配置与使用**&quot;">​</a></h3><p>在 <code>semantic-release</code> 的配置文件（如 <code>.releaserc</code> 或 <code>release.config.js</code>）中，<code>@semantic-release/git</code> 通常与其他插件一起被列出：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    &quot;@semantic-release/commit-analyzer&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/release-notes-generator&quot;,</span></span>
<span class="line"><span>    [&quot;@semantic-release/changelog&quot;, {/* optional configuration */}],</span></span>
<span class="line"><span>    [&quot;@semantic-release/npm&quot;, {/* optional configuration */}],</span></span>
<span class="line"><span>    [&quot;@semantic-release/git&quot;, {/* optional configuration */}], // 在此处指定</span></span>
<span class="line"><span>    &quot;@semantic-release/github&quot;</span></span>
<span class="line"><span>    // 其他插件...</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><h4 id="配置选项-2" tabindex="-1"><strong>配置选项</strong> <a class="header-anchor" href="#配置选项-2" aria-label="Permalink to &quot;**配置选项**&quot;">​</a></h4><p>该插件接受一系列可选配置参数以满足不同的项目需求：</p><ul><li><p><strong>assets</strong>: 数组，指定需要更新版本号的文件路径。默认值为 <code>[&#39;package.json&#39;, &#39;package-lock.json&#39;, &#39;npm-shrinkwrap.json&#39;]</code>。</p></li><li><p><strong>message</strong>: 字符串，定义提交消息模板。支持使用 <code>nextRelease</code> 对象中的属性（如 <code>version</code>、<code>gitTag</code>、<code>channel</code>、<code>notes</code> 等）来动态生成消息内容。默认值为 <code>&quot;chore(release): ${nextRelease.gitTag}&quot;</code>。</p></li><li><p><strong>tagFormat</strong>: 字符串，定义 Git 标签的命名格式。可以使用 <code>nextRelease</code> 对象中的属性。默认值为 <code>&quot;v${nextRelease.version}&quot;</code>。</p></li><li><p><strong>sign</strong>: 布尔值，指示是否使用 GPG 密钥对创建的 Git 标签进行签名。默认值为 <code>false</code>。</p></li><li><p><strong>requireCleanWorkingDir</strong>: 布尔值，指示是否要求工作目录在发布前必须干净（无未提交的更改）。默认值为 <code>true</code>。</p></li><li><p><strong>assets</strong>: 数组，指定除了版本文件外，还需要在提交中包含的其他文件或目录。这些文件或目录的内容将随版本更新一起被提交。默认为空。</p></li><li><p><strong>addUntrackedFiles</strong>: 布尔值，指示是否将所有未跟踪的文件添加到提交中。默认值为 <code>false</code>。</p></li><li><p><strong>noCi</strong>: 布尔值，指示在 CI/CD 环境下是否跳过此插件。默认值为 <code>false</code>。</p></li></ul><h4 id="示例配置-1" tabindex="-1"><strong>示例配置</strong> <a class="header-anchor" href="#示例配置-1" aria-label="Permalink to &quot;**示例配置**&quot;">​</a></h4><p>下面是一个包含自定义配置的示例：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    // ...</span></span>
<span class="line"><span>    [&quot;@semantic-release/git&quot;, {</span></span>
<span class="line"><span>      &quot;assets&quot;: [&quot;package.json&quot;, &quot;dist/my-lib.js&quot;],</span></span>
<span class="line"><span>      &quot;message&quot;: &quot;Release ${nextRelease.version}: ${nextRelease.notes}\n\n[ci skip]&quot;,</span></span>
<span class="line"><span>      &quot;tagFormat&quot;: &quot;release/${nextRelease.version}&quot;,</span></span>
<span class="line"><span>      &quot;sign&quot;: true,</span></span>
<span class="line"><span>      &quot;requireCleanWorkingDir&quot;: false,</span></span>
<span class="line"><span>      &quot;addUntrackedFiles&quot;: true</span></span>
<span class="line"><span>    }],</span></span>
<span class="line"><span>    // ...</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><p>在这个例子中，我们指定了：</p><ul><li>更新 <code>package.json</code> 和 <code>dist/my-lib.js</code> 文件的版本。</li><li>提交消息包含版本号、变更日志摘要，并添加 <code>[ci skip]</code> 标签以避免触发后续 CI 构建。</li><li>Git 标签采用 <code>release/${nextRelease.version}</code> 的格式。</li><li>使用 GPG 密钥对标签进行签名。</li><li>不要求工作目录干净。</li><li>将所有未跟踪的文件添加到提交中。</li></ul><h3 id="总结-2" tabindex="-1"><strong>总结</strong> <a class="header-anchor" href="#总结-2" aria-label="Permalink to &quot;**总结**&quot;">​</a></h3><p><code>@semantic-release/git</code> 插件负责在 <code>semantic-release</code> 自动发布流程中管理和更新项目的 Git 标签以及相关版本文件，确保版本控制系统与发布的软件版本保持同步。 通过灵活的配置选项，开发者可以根据项目特点调整插件行为，如自定义标签命名、文件更新范围、提交消息格式等，从而实现更加契合团队习惯和项目需求的自动化发布流程。</p><h2 id="semantic-release-npm详细说明" tabindex="-1">@semantic-release/npm详细说明 <a class="header-anchor" href="#semantic-release-npm详细说明" aria-label="Permalink to &quot;@semantic-release/npm详细说明&quot;">​</a></h2><p><strong>@semantic-release/npm</strong> 是 <code>semantic-release</code> 生态系统中的一个重要插件，专为使用 Node.js 包管理器（npm）的项目设计。其主要功能是在自动化发布流程中，将新版本的软件包发布到 npm 注册表（通常是公开的 npmjs.com 或私有的 npm 仓库）。以下是 <code>@semantic-release/npm</code> 的详细说明：</p><h3 id="主要功能-3" tabindex="-1"><strong>主要功能</strong> <a class="header-anchor" href="#主要功能-3" aria-label="Permalink to &quot;**主要功能**&quot;">​</a></h3><ul><li><p><strong>版本发布</strong>：基于 <code>semantic-release</code> 分析源代码变动确定的新版本号，将项目打包成相应的 npm 软件包，并将其发布到指定的 npm 注册表。</p></li><li><p><strong>版本文件更新</strong>：自动更新项目中的 <code>package.json</code> 文件中的 <code>version</code> 字段为新版本。</p></li><li><p><strong>生命周期脚本执行</strong>：在发布过程中，可以触发 npm 包中的预定义生命周期脚本，如 <code>prepublishOnly</code>、<code>prepare</code>、<code>postpublish</code> 等，以便在发布前后执行必要的构建、测试、清理等任务。</p></li><li><p><strong>访问控制</strong>：通过使用 npm 凭证（通常存储在环境变量中），确保只有授权用户或机器人能够发布软件包。</p></li><li><p><strong>支持自定义</strong>：允许用户通过配置选项指定 npm 注册表 URL、发布标签（如 <code>latest</code>、<code>next</code> 等）、是否跳过 CI/CD 系统的后续构建步骤等。</p></li></ul><h3 id="配置与使用-3" tabindex="-1"><strong>配置与使用</strong> <a class="header-anchor" href="#配置与使用-3" aria-label="Permalink to &quot;**配置与使用**&quot;">​</a></h3><p>在 <code>semantic-release</code> 的配置文件（如 <code>.releaserc</code> 或 <code>release.config.js</code>）中，<code>@semantic-release/npm</code> 通常与其他插件一起被列出：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    &quot;@semantic-release/commit-analyzer&quot;,</span></span>
<span class="line"><span>    &quot;@semantic-release/release-notes-generator&quot;,</span></span>
<span class="line"><span>    [&quot;@semantic-release/npm&quot;, {/* optional configuration */}], // 在此处指定</span></span>
<span class="line"><span>    [&quot;@semantic-release/git&quot;, {/* optional configuration */}],</span></span>
<span class="line"><span>    &quot;@semantic-release/github&quot;</span></span>
<span class="line"><span>    // 其他插件...</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h4 id="配置选项-3" tabindex="-1"><strong>配置选项</strong> <a class="header-anchor" href="#配置选项-3" aria-label="Permalink to &quot;**配置选项**&quot;">​</a></h4><p>该插件接受一系列可选配置参数以满足不同的项目需求：</p><ul><li><p><strong>pkgRoot</strong>: 字符串，指定包含 <code>package.json</code> 文件的目录路径。默认值为项目根目录。</p></li><li><p><strong>tarballDir</strong>: 字符串，指定临时存放发布 tarball 文件的目录。默认值为系统临时目录。</p></li><li><p><strong>npmPublish</strong>: 布尔值，指示是否实际执行 <code>npm publish</code> 操作。在某些情况下，可能只想生成 npm 包而不立即发布，此时可以设置为 <code>false</code>。默认值为 <code>true</code>。</p></li><li><p><strong>npmRegistryUrl</strong>: 字符串，指定要发布的 npm 注册表 URL。默认值为 <code>https://registry.npmjs.org/</code>，适用于发布到公共 npm 注册表。对于私有 npm 仓库，应提供对应的注册表 URL。</p></li><li><p><strong>npmDistTag</strong>: 字符串，指定发布的 npm 包应被打上哪个 dist-tag。例如，设置为 <code>&quot;next&quot;</code> 可以将包标记为预发布版本。默认值为 <code>&quot;latest&quot;</code>，即稳定版。</p></li><li><p><strong>npmAccess</strong>: 字符串，指定发布的包的访问级别。可选值为 <code>&quot;public&quot;</code>（默认）或 <code>&quot;restricted&quot;</code> 。对于私有包，应设置为 <code>&quot;restricted&quot;</code>。</p></li><li><p><strong>npmToken</strong>: 字符串，指定用于身份验证的 npm 凭证。通常从环境变量（如 <code>NPM_TOKEN</code>）中获取，不应直接写入配置文件。</p></li><li><p><strong>requireCleanWorkingDir</strong>: 布尔值，指示是否要求工作目录在发布前必须干净（无未提交的更改）。默认值为 <code>true</code>。</p></li><li><p><strong>noCi</strong>: 布尔值，指示在 CI/CD 环境下是否跳过此插件。默认值为 <code>false</code>。</p></li></ul><h4 id="示例配置-2" tabindex="-1"><strong>示例配置</strong> <a class="header-anchor" href="#示例配置-2" aria-label="Permalink to &quot;**示例配置**&quot;">​</a></h4><p>下面是一个包含自定义配置的示例：</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes light-plus one-dark-pro vp-code"><code><span class="line"><span>// .releaserc</span></span>
<span class="line"><span>{</span></span>
<span class="line"><span>  &quot;plugins&quot;: [</span></span>
<span class="line"><span>    // ...</span></span>
<span class="line"><span>    [&quot;@semantic-release/npm&quot;, {</span></span>
<span class="line"><span>      &quot;pkgRoot&quot;: &quot;dist/&quot;,</span></span>
<span class="line"><span>      &quot;tarballDir&quot;: &quot;.npm-tarballs&quot;,</span></span>
<span class="line"><span>      &quot;npmPublish&quot;: true,</span></span>
<span class="line"><span>      &quot;npmRegistryUrl&quot;: &quot;https://my-private-npm.registry.example.com/&quot;,</span></span>
<span class="line"><span>      &quot;npmDistTag&quot;: &quot;next&quot;,</span></span>
<span class="line"><span>      &quot;npmAccess&quot;: &quot;restricted&quot;,</span></span>
<span class="line"><span>      &quot;npmToken&quot;: &quot;${NPM_TOKEN}&quot;,</span></span>
<span class="line"><span>      &quot;requireCleanWorkingDir&quot;: false</span></span>
<span class="line"><span>    }],</span></span>
<span class="line"><span>    // ...</span></span>
<span class="line"><span>  ]</span></span>
<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br></div></div><p>在这个例子中，我们指定了：</p><ul><li><code>package.json</code> 位于 <code>dist/</code> 目录。</li><li>发布 tarball 存放在 <code>.npm-tarballs/</code> 目录。</li><li>发布到私有 npm 注册表。</li><li>使用 <code>NPM_TOKEN</code> 环境变量中的凭证进行身份验证。</li><li>发布的包标记为预发布版本（<code>next</code> dist-tag）。</li><li>不要求工作目录干净。</li></ul><h3 id="总结-3" tabindex="-1"><strong>总结</strong> <a class="header-anchor" href="#总结-3" aria-label="Permalink to &quot;**总结**&quot;">​</a></h3><p><code>@semantic-release/npm</code> 插件负责在 <code>semantic-release</code> 自动化发布流程中，将 Node.js 项目打包并发布到指定的 npm 注册表。 它确保了版本更新、包发布、生命周期脚本执行等步骤的自动化，并提供了丰富的配置选项以适应不同项目的发布策略和环境要求。 通过集成 <code>@semantic-release/npm</code>，Node.js 开发者可以实现无缝的持续集成与部署（CI/CD），确保软件包版本管理的语义一致性与发布过程的高效性。</p><h1 id="开发期间版本号" tabindex="-1">开发期间版本号： <a class="header-anchor" href="#开发期间版本号" aria-label="Permalink to &quot;开发期间版本号：&quot;">​</a></h1><p>1、Alpha(α)：</p><p>预览版，或者叫内部测试版；一般不向外部发布，会有很多Bug；一般只有测试人员使用。</p><p>2、Beta(β)：</p><p>测试版，或者叫公开测试版；这个阶段的版本会一直加入新的功能；在 Alpha版之后推出。</p><p>3、RC(Release Candidate)：</p><p>最终版本的候选版本，如果未出现问题则可发布成为正式版本，</p><p>多数开源软件会推出两个RC版本，最后的 RC2 则成为正式版本。</p><h1 id="完成期版本号" tabindex="-1">完成期版本号： <a class="header-anchor" href="#完成期版本号" aria-label="Permalink to &quot;完成期版本号：&quot;">​</a></h1><p>Release版: 该版本意味“最终版本”，在前面版本的一系列测试版之后，终归会有一个正式版本，是最终交付用户使用的一个版本。 该版本有时也称为标准版。一般情况下，Release不会以单词形式出现在软件封面上，取而代之的是符号(R)。 <a href="https://blog.csdn.net/kunwen123/article/details/131905779" target="_blank" rel="noreferrer">软件版本号讲解:什么是Alpha, Beta, RC，Release</a></p><p>GA：（general availability）</p><p>General Availability，正式发布的版本，国外通常用 GA 来标识 release 版本， GA 版本是开发团队认为该版本是稳定版（有的软件可能会标识为 Stable 版本或者 Production 版本，其意思和 GA 相同）， 可以在较为关键的场合使用，比如生产环境。 <img src="/long-press/assets/d69b5039.DYHEPP7h.png" alt=""></p><h2 id="contributors" tabindex="-1">Contributors <a class="header-anchor" href="#contributors" aria-label="Permalink to &quot;Contributors&quot;">​</a></h2><div><section class="border-b-1 border-[var(--vp-c-divider)] w-full border-b-solid mt-[24px] pb-[12px] flex gap-[12px] mb-[12px] flex-wrap max-w-[85%]"><div class="flex gap-[4px] items-center"><svg style="display:inline-block;" viewBox="0 0 16 16" width="1.2em" height="1.2em"><path fill="currentColor" d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16m.847-8.145a2.502 2.502 0 1 0-1.694 0C5.471 8.261 4 9.775 4 11c0 .395.145.995 1 .995h6c.855 0 1-.6 1-.995c0-1.224-1.47-2.74-3.153-3.145"></path></svg> 作者:<span>Long Mo</span></div><!----><!----><div class="flex gap-[4px] items-center"><svg style="display:inline-block;" viewBox="0 0 16 16" width="1.2em" height="1.2em"><path fill="currentColor" d="M9.293 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.707A1 1 0 0 0 13.707 4L10 .293A1 1 0 0 0 9.293 0zM9.5 3.5v-2l3 3h-2a1 1 0 0 1-1-1zM5.485 6.879l1.036 4.144l.997-3.655a.5.5 0 0 1 .964 0l.997 3.655l1.036-4.144a.5.5 0 0 1 .97.242l-1.5 6a.5.5 0 0 1-.967.01L8 9.402l-1.018 3.73a.5.5 0 0 1-.967-.01l-1.5-6a.5.5 0 1 1 .97-.242z"></path></svg> 字数统计:<span>9.4k 字</span></div><div class="flex gap-[4px] items-center"><svg style="display:inline-block;" viewBox="0 0 20 20" width="1.2em" height="1.2em"><path fill="currentColor" d="M10 0a10 10 0 1 0 10 10A10 10 0 0 0 10 0zm2.5 14.5L9 11V4h2v6l3 3z"></path></svg> 阅读时长:<span>33 分钟</span></div></section></div><div class="flex gap-2 items-center"><a href="https://github.com/Longmo666" rel="noreferrer" target="_blank"><img src="https://github.com/Longmo666.png" class="w-8 h-8 rounded-full"></a> Long Mo</div><div class="px-[1.2rem] relative py-[1rem] border-1 border-[var(--vp-c-border)]/[.55] w-full min-h-[32px] border-solid mt-[32px] leading-[24px] rounded-[4px]"><svg style="display:inline-block;" viewBox="0 0 512 512" width="1.2em" height="1.2em" class="absolute top-[1rem] right-[1.2rem]"><path fill="currentColor" d="M256 512a256 256 0 1 0 0-512a256 256 0 1 0 0 512m-56.6-199.4c31.2 31.2 81.9 31.2 113.1 0c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9c-50 50-131 50-181 0s-50-131 0-181s131-50 181 0c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0c-31.2-31.2-81.9-31.2-113.1 0s-31.2 81.9 0 113.1z"></path></svg><section class="flex flex-col gap-y-[8px] overflow-hidden"><div><span class="font-bold">文章作者：</span><span><a href="https://github.com/Longmo666" rel="noreferrer" target="_blank">Long Mo</a></span></div><div><span class="font-bold">版权声明：</span><span> 本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="noreferrer" target="_blank"> CC BY-NC-SA 4.0 </a> 许可协议。转载请注明来自 <a href="#" rel="noreferrer" target="_blank">Longmo Docs</a></span> ！ </div></section></div></div></div></main><footer class="VPDocFooter" data-v-e512d8d8 data-v-73a75ed6><!--[--><!--]--><div class="edit-info" data-v-73a75ed6><div class="edit-link" data-v-73a75ed6><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/xxx" target="_blank" rel="noreferrer" data-v-73a75ed6><!--[--><span class="vpi-square-pen edit-link-icon" data-v-73a75ed6></span> 在 github 上编辑此页<!--]--></a></div><div class="last-updated" data-v-73a75ed6><p class="VPLastUpdated" data-v-73a75ed6 data-v-28126c9f>上次更新: <time datetime="2024-04-22T16:53:50.000Z" data-v-28126c9f></time></p></div></div><nav class="prev-next" data-v-73a75ed6><div class="pager" data-v-73a75ed6><!----></div><div class="pager" data-v-73a75ed6><a class="VPLink link pager-link next" href="/long-press/guide" data-v-73a75ed6><!--[--><span class="desc" data-v-73a75ed6>下一篇</span><span class="title" data-v-73a75ed6>阅读须知</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-4c760b95 data-v-4f1388a4><div class="container" data-v-4f1388a4><!----><p class="copyright" data-v-4f1388a4>Copyright © 2024-present Longmo</p></div></footer><!--[--><!--]--></div></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"css3_lightningcss_index.md\":\"DvrpJ9-C\",\"css3_现代web布局_02.md\":\"NnFPbKjC\",\"css3_postcss_postcss-prefix-selector增加统一作用域.md\":\"BTi7xZ9T\",\"css3_现代web布局_01.md\":\"CSOVLYFa\",\"css3_index.md\":\"gWeubSHW\",\"css3_现代web布局_05.md\":\"XnHgE5qs\",\"css3_现代web布局_07.md\":\"B0JalRYm\",\"electron_electron开发实战_index.md\":\"DlTk4nHM\",\"css3_现代web布局_10.md\":\"QvmMy1qK\",\"css3_现代web布局_03.md\":\"DndCH4AP\",\"css3_现代web布局_22.md\":\"BTcBI1Ar\",\"css3_现代web布局_index.md\":\"BRrTkyN-\",\"react_antd使用踩坑经验汇总_procomponents_index.md\":\"CnA6aYv_\",\"nodejs_change-case更改大小写.md\":\"CtntdOEt\",\"react_react好用的插件_rxjs-hooks.md\":\"CahRrTvr\",\"nodejs_复制移动文件.md\":\"DJvz4Dcu\",\"css3_现代web布局_15.md\":\"CxTdKubj\",\"css3_现代web布局_06.md\":\"DKzKVbHi\",\"guide_axios封装.md\":\"yeyMeLKL\",\"react_react实战_设计模式与最佳实践_服务器端渲染（1）：基本套路.md\":\"Ci9ZteTc\",\"react_react实战_设计模式与最佳实践_react 单元测试.md\":\"ghuW9_Ym\",\"react_react好用的插件_react-to-print.md\":\"DUEXVCMF\",\"css3_现代web布局_12.md\":\"DzvNLnB9\",\"react_react好用的插件_react-load-script.md\":\"DBiqdA1k\",\"electron_electron开发实战_释放前端想象力.md\":\"DjfKiu2P\",\"react_react实战_设计模式与最佳实践_react的设计思想.md\":\"CDFxAnJB\",\"react_react组件库搭建指南_02开发调试.md\":\"C_T24zrV\",\"react_react实战_设计模式与最佳实践_react 的未来（1）： 拥抱异步渲染.md\":\"DDCdfFZA\",\"react_react实战_设计模式与最佳实践_react 状态管理（1）：组件状态.md\":\"CleS-bmU\",\"react_react好用的插件_react-viewer.md\":\"CK92G5ky\",\"electron_electron开发实战_electron应用打包.md\":\"DVihGNUt\",\"react_react好用的插件_index.md\":\"CYvYsgxN\",\"react_react好用的插件_formik-antd.md\":\"BVXoD1vi\",\"react_react实战_设计模式与最佳实践_组件设计模式（2）：高阶组件.md\":\"tcEHCkX9\",\"react_css解决方案_styled-components.md\":\"BdEVJSYP\",\"react_react后台管理系统项目实战_index.md\":\"Cf5Aki5e\",\"react_react好用的插件_floating-ui.md\":\"CJ47U607\",\"react_react好用的插件_js-pinyin.md\":\"CCi7zpiQ\",\"electron_electron开发实战_原生gui.md\":\"CKymHWIE\",\"react_antd使用踩坑经验汇总_tabs选项卡.md\":\"DbBQtB84\",\"react_react好用的插件_immer.md\":\"J3J2rLev\",\"css3_现代web布局_08.md\":\"CKAlv-cw\",\"react_react好用的插件_@ebay_nice-modal-react.md\":\"2t81QhzX\",\"react_react hooks.md\":\"DllmXlwe\",\"react_发布订阅_事件总线.md\":\"DGl0tyUU\",\"react_react组件库搭建指南_03编译打包.md\":\"BSWt83_X\",\"guide_quickstart.md\":\"DNtvLzj7\",\"react_开发一个组件库_如何完善组件单测.md\":\"9v27j5fA\",\"react_慕课网最新react技术栈，实战复杂低代码项目-仿问卷星_index.md\":\"DV2mTP-I\",\"react_ahooks_usewhydidyouupdate.md\":\"DeDGpqMK\",\"react_开发一个组件库_index.md\":\"DFCM9Fyc\",\"react_ahooks_usemutationobserver.md\":\"DopGRhup\",\"react_ahooks_uselocalstoragestate.md\":\"CNKG9DfH\",\"react_如何写出更优雅的 react 组件.md\":\"BNRAsuz5\",\"react_ahooks_useeventlistener.md\":\"C022IGRg\",\"react_ahooks_useloading.md\":\"hmNqPF-b\",\"react_ahooks_usethrottle.md\":\"Cxs7sHDg\",\"react_ahooks_usevirtuallist.md\":\"CbSqBIa_\",\"react_ahooks_index.md\":\"BZgeYQAN\",\"react_ahooks_usethrottleeffect.md\":\"Cu9lbAeN\",\"react_ahooks_useinterval.md\":\"z_JjaRUC\",\"react_ahooks_useinfinitescroll.md\":\"05X3BT3k\",\"react_ahooks_useboolean.md\":\"B9uk9pv1\",\"react_ahooks_usehover.md\":\"CQ90ygMl\",\"react_ahooks_usetoggle.md\":\"Dhg-kOcZ\",\"css3_现代web布局_16.md\":\"DqleGwZV\",\"electron_前端必学的桌面开发：electron_react开发桌面应用_1w多字超详细.md\":\"B4S71t_j\",\"react_index.md\":\"VMykJvDU\",\"react_ahooks_usethrottlefn.md\":\"h86SJGdz\",\"react_ahooks_useurlstate.md\":\"N0NRnJcE\",\"react_ahooks_usetrackedeffect.md\":\"DikGGrmT\",\"react_状态管理_natur.md\":\"CjabmgMv\",\"react_ahooks_useantdtable.md\":\"BRTEfq-4\",\"react_ahooks_userafinterval.md\":\"DbqchCta\",\"react_ahooks_useunmount.md\":\"DKpqgfJ2\",\"getting_index.md\":\"CslhLb_Q\",\"react_ahooks_usepagination.md\":\"BZPuA30r\",\"react_react好用的插件_react-jsx-parse.md\":\"BFws_Jvt\",\"react_ahooks_useprevious.md\":\"DoaMcKL0\",\"react_数据请求的reacthooks库_index.md\":\"BVjU5EHg\",\"nodejs_解压缩.md\":\"B8sDL8Ck\",\"react_开发一个组件库_handlebars模板.md\":\"eFtlYiJE\",\"react_自定义hooks_useasynceffect.md\":\"0TOcgDP8\",\"react_ahooks_usewebsocket.md\":\"BSCnKAhD\",\"css3_现代web布局_09.md\":\"CJg03gvR\",\"react_ahooks_useasynceffect.md\":\"LHnOKcnJ\",\"移动端项目_index.md\":\"BYabTvu-\",\"react_ahooks_usememoizedfn.md\":\"BHTS7A7g\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_index.md\":\"BOXXNcld\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第04章 ts 类易被忽视的重要技能，单件设计模式和相关技能深入.md\":\"CCgSUH_B\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第11章 运用 ts 手写 promise 源码.md\":\"BalHRnKD\",\"react_性能监控_index.md\":\"BLRO71Ft\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第03章 ts类方法代码优化的三大法宝： 函数重载、类方法重载、类构造器重载.md\":\"BS1BYvbm\",\"standard_fatherrc.ts配置文件.md\":\"Dkdjh5--\",\"react_自定义hooks_useexceldownload.md\":\"DGb3CWTU\",\"tools_runjs.md\":\"IzZ9xe5N\",\"tools_自动版本管理和生成changelog.md\":\"Dak6Id3b\",\"react_react实战_设计模式与最佳实践_路由的魔法：react router.md\":\"CZ2pkqmc\",\"tools_依赖镜像地址.md\":\"D5Etjm_v\",\"react_react实战_设计模式与最佳实践_组件设计模式（5）：组合组件.md\":\"D54UFiB5\",\"tools_workspaces核心特性总结.md\":\"CxNbObiL\",\"react_自定义hooks_usegreatasync.md\":\"DRVA9yrK\",\"react_react组件库搭建指南_05标准化发布流程.md\":\"BCCPnMto\",\"react_react实战_设计模式与最佳实践_组件设计模式（1）：聪明组件和傻瓜组件.md\":\"tHZI-Xkb\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第05章 ts继承深入_手写优化底层源码.md\":\"B3EQqYKB\",\"tools_rollup打包.md\":\"tSbCVBX5\",\"tools_webstorm快捷键.md\":\"wTpb7qJx\",\"react_react实战_设计模式与最佳实践_服务器端渲染（2）理解nextjs.md\":\"BqBtpEHC\",\"tools_vscode使用教程.md\":\"CqieXqJ8\",\"react_react最佳实践.md\":\"CG2Xrs5X\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第07章 泛型类_泛型接口_泛型类约束的复杂应用【无比重要的深度技能】.md\":\"CuEcP3SC\",\"react_自定义hooks_useeffectenhanced.md\":\"BSK0VwJa\",\"vue_index.md\":\"OW-QE8NS\",\"react_状态管理_react中的组件通信方案.md\":\"D8VvM0h8\",\"typescript_ts 从入门到深度掌握，晋级typescript高手实战课程_index.md\":\"CHFAmRtj\",\"standard_pretty-quick.md\":\"CL9LWL6Z\",\"typescript_ts 从入门到深度掌握，晋级typescript高手实战课程_第10章ts声明文件，ts模块.md\":\"BgUWX90K\",\"react_ahooks_usesetstate.md\":\"jYidiqGI\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第06章 ts高频使用技能： 类型断言、类型守卫、自定义守卫_ 多态_类型守卫组合应用.md\":\"DTiCfWrY\",\"standard_typings.d.ts.md\":\"COgkopwu\",\"react_react实战_设计模式与最佳实践_组件设计模式（4）：提供者模式.md\":\"CpJkLsBD\",\"typescript_axios_index.md\":\"CjiV2R0j\",\"css3_现代web布局_23.md\":\"DtcX9bTS\",\"electron_electron开发实战_app特性.md\":\"CCGKgh2J\",\"tools_常用命令.md\":\"BCECAPPN\",\"react_ahooks_useupdateeffect.md\":\"B8UnIDT1\",\"tools_npm镜像源管理工具.md\":\"BQvl6-cK\",\"react_自定义hooks_index.md\":\"TbSBlD7i\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第15章 js 原型_复杂原型继承 【查漏补缺】.md\":\"Bym60KVf\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第12章整合vue3手写高水准大厂的ts版vuex4源码.md\":\"Cb3ALa6o\",\"react_css解决方案_css_module.md\":\"kmxgfb6l\",\"css3_现代web布局_04.md\":\"qxIAivzd\",\"react_ahooks_useraftimeout.md\":\"zZ6X2MGp\",\"react_自定义hooks_usecopy.md\":\"B_vVrQah\",\"react_useform.md\":\"D7K5ezD8\",\"css3_现代web布局_27.md\":\"DVEkZdZW\",\"react_状态管理_valtio.md\":\"CXPGtt95\",\"typescript_tsup如何使用.md\":\"CHCfoXjX\",\"react_ahooks_usecookiestate.md\":\"CdRty31d\",\"tools_node各类命令.md\":\"Dp8hvkZX\",\"electron_electron开发实战_electron优化白屏.md\":\"TluuIOV8\",\"css3_现代web布局_24.md\":\"BTAj5AxQ\",\"css3_现代web布局_13.md\":\"BvIlMTco\",\"css3_现代web布局_14.md\":\"CXYZfM8r\",\"react_antd使用踩坑经验汇总_antdtable表格.md\":\"DJY5Mvdl\",\"guide_babel.md\":\"DTbGDSVq\",\"react_状态管理_zustand翻译文档.md\":\"D72s6MxU\",\"guide_index.md\":\"zNzT7elx\",\"tools_资源导航.md\":\"ByR0zpON\",\"react_antd使用踩坑经验汇总_menu菜单.md\":\"CUT3snoK\",\"tools_pnpm多包项目.md\":\"B5SWK1rS\",\"guide_webpack插件.md\":\"RycubFW9\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第02章 全栈思维全面深度掌握 ts 类.md\":\"DT7QMqkY\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第10章 从装饰器应用，底层 js 到 仿 nestjs实战，路由器底层复杂泛型.md\":\"D8kaCtfy\",\"electron_electron开发实战_开发一个简单版的番茄钟.md\":\"CrvCihNB\",\"react_ahooks_useclickaway.md\":\"CZiIOkBS\",\"index.md\":\"C-4ajOyn\",\"react_自定义hooks_useinterval.md\":\"CL7txl3c\",\"nodejs_请求工具类.md\":\"pJv1vv26\",\"react_ahooks_usedebouncefn.md\":\"DoBqhrGU\",\"getting_why.md\":\"B0La2IDF\",\"vue_vue2打包优化.md\":\"o7QF6PW3\",\"nodejs_globby.md\":\"CTH274g9\",\"standard_tsconfig.json.md\":\"CFCzGYxu\",\"react_reactrouter.md\":\"B9PtxEJ9\",\"typescript_ts-challenge.md\":\"CQjhG-Mq\",\"css3_现代web布局_18.md\":\"DbKppEVn\",\"react_ahooks_usedebounce.md\":\"DRqZkoSI\",\"react_自定义hooks_useintersection.md\":\"Bvd3uAWW\",\"nodejs_cli工具_index.md\":\"CGwLSUZ5\",\"react_react实战_设计模式与最佳实践_index.md\":\"C8mvV9MI\",\"tools_规范git代码提交信息.md\":\"BASOsPqX\",\"tools_windows测试ip端口.md\":\"DG6x0Mw8\",\"electron_electron开发实战_使用nodejs调用原生模块.md\":\"CRvmiRGG\",\"nodejs_kill-port跨平台解决端口占用问题.md\":\"BEoOmVOA\",\"css3_现代web布局_28.md\":\"jsAdcmE1\",\"react_react实战_设计模式与最佳实践_组件实践（1）：如何定义清晰可维护的接口.md\":\"C9ky0LxI\",\"react_react实战_设计模式与最佳实践_react 的未来（3）：函数化的 hooks.md\":\"CFPGDH01\",\"react_react组件库搭建指南_index.md\":\"DavlhH-3\",\"react_react避坑指南_usecallback_usememo.md\":\"DBJVYTaL\",\"standard_prettier.md\":\"B8zmNcDZ\",\"react_react实战_设计模式与最佳实践_组件设计模式（3）：render props 模式.md\":\"J6wo2neN\",\"standard_git提交规范.md\":\"BY6vFgPF\",\"css3_现代web布局_26.md\":\"BlwKd9DD\",\"react_redux.md\":\"BR83V68G\",\"nodejs_fs-extra文件系统扩展.md\":\"BeGbM1-y\",\"react_react组件库搭建指南_06dumi2.x的使用.md\":\"BovenX8E\",\"tools_github常用技巧.md\":\"DCwuF17j\",\"electron_数据持久缓存方案_electron-store.md\":\"6LHFkhuG\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第08章 深度掌握泛型函数、泛型函数重载【无比重要的深度技能】.md\":\"BvOBMPMd\",\"nodejs_semantic-release.md\":\"B_4_SZrq\",\"react_react实战_设计模式与最佳实践_组件实践（2）：组件的内部实现.md\":\"pvpT0TG5\",\"typescript_tslib如何使用.md\":\"BsoCW_pQ\",\"react_react实战_设计模式与最佳实践_组件实践（3）：组件化样式.md\":\"DGiADrWs\",\"react_css解决方案_index.md\":\"Q7QSPlYi\",\"typescript_tsdx使用.md\":\"Bcl_A70V\",\"css3_现代web布局_17.md\":\"BCxBKcNP\",\"react_react避坑指南_usestate.md\":\"DK9-NLHJ\",\"electron_react中开发踩坑.md\":\"DpZMxt4e\",\"react_react实战_设计模式与最佳实践_react 的未来（2）：suspense 带来的异步操作革命.md\":\"BLMrhryT\",\"guide_两个跨域页面进行跳转传参的终极方案.md\":\"DrhWeMH4\",\"react_react避坑指南_index.md\":\"DSoRNwmH\",\"react_自定义hooks_useinputhistory.md\":\"BzWdP5Ij\",\"react_ahooks_useeventemitter.md\":\"OluScTeX\",\"react_自定义hooks_usedebounce.md\":\"7ESFZNIZ\",\"electron_dll使用.md\":\"CGmPSJLR\",\"css3_现代web布局_19.md\":\"DIVJU0PC\",\"react_react好用的插件_react-fast-marquee.md\":\"ZhOvpApp\",\"guide_markdown语法.md\":\"BiAJoIJO\",\"nodejs_execa执行外部命令.md\":\"x2fLlbix\",\"nodejs_npkill快速查找删除node_modules.md\":\"CCmNiMZ0\",\"react_ahooks_usefullscreen.md\":\"BkgW8e5k\",\"react_自定义hooks_usesetparticalstate.md\":\"BUv_cnmS\",\"standard_css规范.md\":\"DeHg6jnS\",\"electron_数据持久缓存方案_数据持久缓存库lndb.md\":\"DJUK7UVx\",\"react_自定义组件_如何在react应用中建立错误处理层.md\":\"CNGgmToJ\",\"react_react搞定复杂项目状态管理_index.md\":\"BAj7---e\",\"typescript_晋级typescript高手，成为抢手的前端开发人才_第09章 深入infer、ts高级类型、泛型再进阶【全方位深度掌握 ts 泛型】.md\":\"C4bu5mph\",\"tools_idea 注释模板配置.md\":\"0gbuJbd6\",\"electron_基于electron-vite构建react桌面客户端.md\":\"DLOPvG7Q\",\"nodejs_release-it.md\":\"DMPaqLXc\",\"react_react实战_设计模式与最佳实践_react 状态管理（3）：mobx 使用模式.md\":\"Bm7xwY_i\",\"react_ahooks_usehistorytravel.md\":\"DiEJa1G5\",\"css3_现代web布局_21.md\":\"D2PeNBzk\",\"css3_现代web布局_11.md\":\"B10tI7m_\",\"react_antd使用踩坑经验汇总_tree组件.md\":\"CHpE5yvc\",\"electron_electron-builder.md\":\"DNL_pnq4\",\"standard_vue规范.md\":\"DyiLpRai\",\"electron_index.md\":\"BRqk3UrY\",\"react_自定义hooks_userouter.md\":\"LSydLgnY\",\"utils_rxjs.md\":\"C9QQC7cC\",\"standard_codereview代码审查.md\":\"vOhADmqT\",\"react_ahooks_userequest函数.md\":\"erWiB1Ub\",\"react_自定义hooks_usedebouncefn.md\":\"CD-kzD_X\",\"linux_linux常用命令.md\":\"D7RSIp22\",\"standard_commitlint.md\":\"Bc6BHMQJ\",\"react_自定义hooks_uselocationlisten.md\":\"lpoaVI0f\",\"standard_组件封装规范.md\":\"0Ow45yWm\",\"react_自定义hooks_useecharts.md\":\"GJwF9MkV\",\"nodejs_bluebird超高性能的promise库.md\":\"DY98ImvT\",\"react_react避坑指南_useref.md\":\"fBjuCQ9O\",\"electron_electron开发实战_electron环境搭建.md\":\"BaHlrXyB\",\"utils_index.md\":\"mk7T0j55\",\"react_自定义hooks_useevent.md\":\"Comn2-Er\",\"typescript_index.md\":\"Dcw9VPNE\",\"standard_git分支开发规范.md\":\"BIXsyTAc\",\"electron_三方库.md\":\"CAt92F-s\",\"react_react组件库搭建指南_01项目初始化.md\":\"hYE7GWll\",\"react_react好用的插件_jsbarcode.md\":\"CBTRcUAR\",\"electron_electron-react-boilerplate.md\":\"BzWSbABc\",\"react_自定义hooks_usemodal.md\":\"B_XFkn0G\",\"standard_editorconfig.md\":\"D8UrOG7b\",\"tools_git基本使用.md\":\"BvP_0S5g\",\"react_react避坑指南_闭包陷阱.md\":\"zChJGfX2\",\"standard_prettierrc.md\":\"BdHhuL9t\",\"standard_babelrc.md\":\"DxUrlX2l\",\"standard_eslint规范.md\":\"Mu3t4FWn\",\"react_react实战_设计模式与最佳实践_react 状态管理（4）：不同方式对比.md\":\"C3iD1iFV\",\"react_antd使用踩坑经验汇总_index.md\":\"DDsanD1T\",\"tools_yalc本地调试组件库方案.md\":\"BQ3H5AQN\",\"standard_json格式规范.md\":\"B3NuLvz_\",\"electron_配置讲解.md\":\"Bz4ASaED\",\"nodejs_index.md\":\"D6qsbk0v\",\"standard_node_cjs和esm混合开发.md\":\"DedlYZ1u\",\"css3_现代web布局_25.md\":\"DZBc6jqi\",\"standard_stylelint.md\":\"zaLGDP6-\",\"react_自定义hooks_useformmodal.md\":\"DRclMTXI\",\"standard_开源证书.md\":\"CNa1gXoD\",\"react_antd使用踩坑经验汇总_其他弹出层.md\":\"CYvGLZdo\",\"utils_baseinputnumber.md\":\"CCJr66pT\",\"guide_installation.md\":\"Cyna48DO\",\"utils_lodash.md\":\"B_LD-ulc\",\"standard_react规范.md\":\"BDzywc_U\",\"standard_sytlelint.md\":\"BHAGjA08\",\"tools_readme.md自动生成目录.md\":\"Doh9u-Eg\",\"react_自定义hooks_usememo.md\":\"CZgD0tn_\",\"standard_gitignore.md\":\"DGdE7Xq3\",\"react_react避坑指南_useeffect.md\":\"BNAb8N04\",\"nodejs_pkg打包node程序.md\":\"C_mVgg8Y\",\"standard_husky.md\":\"DWpB1fyF\",\"utils_calcutils.md\":\"QyONwp33\",\"tools_index.md\":\"CrRsxT5W\",\"standard_index.md\":\"zy5tYKLI\",\"react_自定义hooks_usemethods.md\":\"CLURCU9f\",\"react_自定义hooks_useloadscript.md\":\"CYcWRvSo\",\"tools_google快捷键.md\":\"mD76rDlK\",\"standard_package.json.md\":\"jsOo3MDQ\",\"standard_前端开发最佳实践总结.md\":\"BGrFiLKW\",\"react_自定义hooks_usesafestate.md\":\"m62ZMP2_\",\"standard_prettierignore.md\":\"VM68Ff5l\",\"react_react实战_设计模式与最佳实践_react 状态管理（2）：redux 使用模式.md\":\"CA0pcV96\",\"utils_mitt.md\":\"DG7F8qQl\",\"standard_gitlab.yml.md\":\"lN9PqoBe\",\"nodejs_minimist命令行参数解析.md\":\"Dx4gEgi2\",\"standard_命名规范.md\":\"DWUPIS4I\",\"react_自定义hooks_usepersistcallback.md\":\"FHXVMyDJ\",\"tools_windows终端优化.md\":\"DANvAyOj\",\"electron_ssl证书.md\":\"Q1dQBluF\",\"react_自定义组件_lazyload.md\":\"B9Bn4iLf\",\"react_自定义组件_keepalive.md\":\"YY9acXG_\",\"tools_常用node库.md\":\"DTeGhNPp\",\"standard_lint-staged.md\":\"DidcSpvQ\",\"css3_现代web布局_20.md\":\"DVP5FwHt\",\"guide_数字相关知识.md\":\"BRzTdbnI\",\"standard_圈复杂度.md\":\"B-UtHNKH\",\"tools_windows快捷键.md\":\"BFgiqO74\",\"standard_ts规范.md\":\"CiDbO0cg\",\"react_antd使用踩坑经验汇总_form表单.md\":\"DGT8jzsZ\",\"react_状态管理_zustand.md\":\"CQAFP37K\",\"react_react好用的插件_react-hook-form.md\":\"BsJSOnXN\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"龙陌的博客\",\"description\":\"基于vite为基础搭建的风格脚手架,提供多种模板以便于更高效的解决业务需求！\",\"base\":\"/long-press/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.ico\",\"nav\":[{\"text\":\"💻 首页\",\"link\":\"/\"},{\"text\":\"💡 指南\",\"link\":\"/guide/\",\"activeMatch\":\"/guide/\"},{\"text\":\"🔧 编程工具\",\"link\":\"/tools/\"},{\"text\":\"🔧 常用工具类\",\"link\":\"/utils/\"},{\"text\":\"📋 前端规范\",\"link\":\"/standard/\"},{\"text\":\"⭐ React\",\"link\":\"/react/React实战,设计模式与最佳实践/\"},{\"text\":\"⭐ TypeScript\",\"link\":\"/typescript/\"},{\"text\":\"⭐ Css3\",\"link\":\"/css3/\"},{\"text\":\"⭐ Electron\",\"link\":\"/electron/\"},{\"text\":\"⭐ Linux\",\"link\":\"/linux/linux常用命令\",\"activeMatch\":\"/linux/\"}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://vitepress.vuejs.org/guide/getting-started\"},{\"icon\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" aria-hidden=\\\"true\\\" role=\\\"img\\\" width=\\\"20\\\" height=\\\"20\\\"  viewBox=\\\"0 0 512 512\\\" >\\n    <path fill=\\\"currentColor\\\" d=\\\"M488.6 104.1c16.7 18.1 24.4 39.7 23.3 65.7v202.4c-.4 26.4-9.2 48.1-26.5 65.1c-17.2 17-39.1 25.9-65.5 26.7H92.02c-26.45-.8-48.21-9.8-65.28-27.2C9.682 419.4.767 396.5 0 368.2V169.8c.767-26 9.682-47.6 26.74-65.7C43.81 87.75 65.57 78.77 92.02 78h29.38L96.05 52.19c-5.75-5.73-8.63-13-8.63-21.79c0-8.8 2.88-16.06 8.63-21.797C101.8 2.868 109.1 0 117.9 0s16.1 2.868 21.9 8.603L213.1 78h88l74.5-69.397C381.7 2.868 389.2 0 398 0c8.8 0 16.1 2.868 21.9 8.603c5.7 5.737 8.6 12.997 8.6 21.797c0 8.79-2.9 16.06-8.6 21.79L394.6 78h29.3c26.4.77 48 9.75 64.7 26.1zm-38.8 69.7c-.4-9.6-3.7-17.4-10.7-23.5c-5.2-6.1-14-9.4-22.7-9.8H96.05c-9.59.4-17.45 3.7-23.58 9.8c-6.14 6.1-9.4 13.9-9.78 23.5v194.4c0 9.2 3.26 17 9.78 23.5s14.38 9.8 23.58 9.8H416.4c9.2 0 17-3.3 23.3-9.8c6.3-6.5 9.7-14.3 10.1-23.5V173.8zm-264.3 42.7c6.3 6.3 9.7 14.1 10.1 23.2V273c-.4 9.2-3.7 16.9-9.8 23.2c-6.2 6.3-14 9.5-23.6 9.5c-9.6 0-17.5-3.2-23.6-9.5c-6.1-6.3-9.4-14-9.8-23.2v-33.3c.4-9.1 3.8-16.9 10.1-23.2c6.3-6.3 13.2-9.6 23.3-10c9.2.4 17 3.7 23.3 10zm191.5 0c6.3 6.3 9.7 14.1 10.1 23.2V273c-.4 9.2-3.7 16.9-9.8 23.2c-6.1 6.3-14 9.5-23.6 9.5c-9.6 0-17.4-3.2-23.6-9.5c-7-6.3-9.4-14-9.7-23.2v-33.3c.3-9.1 3.7-16.9 10-23.2c6.3-6.3 14.1-9.6 23.3-10c9.2.4 17 3.7 23.3 10z\\\"></path>\\n  </svg>\"},\"link\":\"https://space.bilibili.com/248956095\"}],\"footer\":{\"copyright\":\"Copyright © 2024-present Longmo\"},\"sidebar\":{\"/\":[{\"text\":\"开始阅读\",\"collapsed\":false,\"items\":[{\"text\":\"阅读须知\",\"link\":\"/guide\"}]}],\"/tools/\":[{\"collapsed\":false,\"items\":[{\"text\":\"GitHub常用技巧\",\"link\":\"\\\\tools\\\\GitHub常用技巧.md\"},{\"text\":\"Google快捷键\",\"link\":\"\\\\tools\\\\Google快捷键.md\"},{\"text\":\"README.md自动生成目录\",\"link\":\"\\\\tools\\\\README.md自动生成目录.md\"},{\"text\":\"Rollup打包\",\"link\":\"\\\\tools\\\\Rollup打包.md\"},{\"text\":\"Runjs\",\"link\":\"\\\\tools\\\\Runjs.md\"},{\"text\":\"Vscode使用教程\",\"link\":\"\\\\tools\\\\Vscode使用教程.md\"},{\"text\":\"WebStorm快捷键\",\"link\":\"\\\\tools\\\\WebStorm快捷键.md\"},{\"text\":\"Windows快捷键\",\"link\":\"\\\\tools\\\\Windows快捷键.md\"},{\"text\":\"Windows测试IP端口\",\"link\":\"\\\\tools\\\\Windows测试IP端口.md\"},{\"text\":\"Windows终端优化\",\"link\":\"\\\\tools\\\\Windows终端优化.md\"},{\"text\":\"Yalc本地调试组件库方案\",\"link\":\"\\\\tools\\\\Yalc本地调试组件库方案.md\"},{\"text\":\"git基本使用\",\"link\":\"\\\\tools\\\\git基本使用.md\"},{\"text\":\"idea 注释模板配置\",\"link\":\"\\\\tools\\\\idea 注释模板配置.md\"},{\"text\":\"node各类命令\",\"link\":\"\\\\tools\\\\node各类命令.md\"},{\"text\":\"npm镜像源管理工具\",\"link\":\"\\\\tools\\\\npm镜像源管理工具.md\"},{\"text\":\"pnpm多包项目\",\"link\":\"\\\\tools\\\\pnpm多包项目.md\"},{\"text\":\"workspaces核心特性总结\",\"link\":\"\\\\tools\\\\workspaces核心特性总结.md\"},{\"text\":\"依赖镜像地址\",\"link\":\"\\\\tools\\\\依赖镜像地址.md\"},{\"text\":\"常用node库\",\"link\":\"\\\\tools\\\\常用node库.md\"},{\"text\":\"常用命令\",\"link\":\"\\\\tools\\\\常用命令.md\"},{\"text\":\"自动版本管理和生成CHANGELOG\",\"link\":\"\\\\tools\\\\自动版本管理和生成CHANGELOG.md\"},{\"text\":\"规范GIT代码提交信息\",\"link\":\"\\\\tools\\\\规范GIT代码提交信息.md\"},{\"text\":\"资源导航\",\"link\":\"\\\\tools\\\\资源导航.md\"}]}],\"/standard/\":[{\"collapsed\":false,\"items\":[{\"text\":\"CodeReview代码审查\",\"link\":\"\\\\standard\\\\CodeReview代码审查.md\"},{\"text\":\"Css规范\",\"link\":\"\\\\standard\\\\Css规范.md\"},{\"text\":\"Git分支开发规范\",\"link\":\"\\\\standard\\\\Git分支开发规范.md\"},{\"text\":\"Node_CJS和ESM混合开发\",\"link\":\"\\\\standard\\\\Node_CJS和ESM混合开发.md\"},{\"text\":\"React规范\",\"link\":\"\\\\standard\\\\React规范.md\"},{\"text\":\"babelrc\",\"link\":\"\\\\standard\\\\babelrc.md\"},{\"text\":\"commitlint\",\"link\":\"\\\\standard\\\\commitlint.md\"},{\"text\":\"editorconfig\",\"link\":\"\\\\standard\\\\editorconfig.md\"},{\"text\":\"eslint规范\",\"link\":\"\\\\standard\\\\eslint规范.md\"},{\"text\":\"fatherrc.ts配置文件\",\"link\":\"\\\\standard\\\\fatherrc.ts配置文件.md\"},{\"text\":\"gitignore\",\"link\":\"\\\\standard\\\\gitignore.md\"},{\"text\":\"gitlab.yml\",\"link\":\"\\\\standard\\\\gitlab.yml.md\"},{\"text\":\"git提交规范\",\"link\":\"\\\\standard\\\\git提交规范.md\"},{\"text\":\"husky\",\"link\":\"\\\\standard\\\\husky.md\"},{\"text\":\"json格式规范\",\"link\":\"\\\\standard\\\\json格式规范.md\"},{\"text\":\"lint-staged\",\"link\":\"\\\\standard\\\\lint-staged.md\"},{\"text\":\"package.json\",\"link\":\"\\\\standard\\\\package.json.md\"},{\"text\":\"prettier\",\"link\":\"\\\\standard\\\\prettier.md\"},{\"text\":\"prettierignore\",\"link\":\"\\\\standard\\\\prettierignore.md\"},{\"text\":\"prettierrc\",\"link\":\"\\\\standard\\\\prettierrc.md\"},{\"text\":\"pretty-quick\",\"link\":\"\\\\standard\\\\pretty-quick.md\"},{\"text\":\"stylelint\",\"link\":\"\\\\standard\\\\stylelint.md\"},{\"text\":\"sytlelint\",\"link\":\"\\\\standard\\\\sytlelint.md\"},{\"text\":\"tsconfig.json\",\"link\":\"\\\\standard\\\\tsconfig.json.md\"},{\"text\":\"ts规范\",\"link\":\"\\\\standard\\\\ts规范.md\"},{\"text\":\"typings.d.ts\",\"link\":\"\\\\standard\\\\typings.d.ts.md\"},{\"text\":\"vue规范\",\"link\":\"\\\\standard\\\\vue规范.md\"},{\"text\":\"前端开发最佳实践总结\",\"link\":\"\\\\standard\\\\前端开发最佳实践总结.md\"},{\"text\":\"命名规范\",\"link\":\"\\\\standard\\\\命名规范.md\"},{\"text\":\"圈复杂度\",\"link\":\"\\\\standard\\\\圈复杂度.md\"},{\"text\":\"开源证书\",\"link\":\"\\\\standard\\\\开源证书.md\"},{\"text\":\"组件封装规范\",\"link\":\"\\\\standard\\\\组件封装规范.md\"}]}],\"/aHooks/\":[],\"/utils/\":[{\"collapsed\":false,\"items\":[{\"text\":\"BaseInputNumber\",\"link\":\"\\\\utils\\\\BaseInputNumber.md\"},{\"text\":\"calcUtils\",\"link\":\"\\\\utils\\\\calcUtils.md\"},{\"text\":\"lodash\",\"link\":\"\\\\utils\\\\lodash.md\"},{\"text\":\"mitt\",\"link\":\"\\\\utils\\\\mitt.md\"},{\"text\":\"rxjs\",\"link\":\"\\\\utils\\\\rxjs.md\"}]}],\"/guide/\":[{\"text\":\"基础\",\"items\":[{\"text\":\"快速开始\",\"link\":\"/guide/quickstart\"},{\"text\":\"Markdown语法\",\"link\":\"/guide/Markdown语法\"}]},{\"text\":\"进阶\",\"items\":[{\"text\":\"打包指南\",\"link\":\"/guide/打包指南\"}]}],\"/react/\":{\"base\":\"/react/\",\"items\":[{\"text\":\"React基础\",\"base\":\"/react/\",\"collapsed\":false,\"items\":[{\"text\":\"Redux\",\"link\":\"Redux\"},{\"text\":\"React Hooks\",\"link\":\"React Hooks\"},{\"text\":\"ReactRouter\",\"link\":\"ReactRouter\"}]},{\"text\":\"Antd使用踩坑经验汇总\",\"base\":\"/react/Antd使用踩坑经验汇总/\",\"items\":[{\"text\":\"Form表单\",\"link\":\"Form表单\"},{\"text\":\"AntdTable表格\",\"link\":\"AntdTable表格\"},{\"text\":\"Tree树组件\",\"link\":\"Tree组件\"},{\"text\":\"其他弹出层\",\"link\":\"其他弹出层\"},{\"text\":\"Tabs选项卡\",\"link\":\"Tabs选项卡\"},{\"text\":\"Menu菜单\",\"link\":\"Menu菜单\"},{\"text\":\"Menu菜单\",\"link\":\"Menu菜单\"}]},{\"text\":\"CSS解决方案\",\"base\":\"/react/CSS解决方案/\",\"items\":[{\"text\":\"CSS Module\",\"link\":\"CSS_Module\"}]},{\"text\":\"ahooks\",\"link\":\"/aHooks/\"},{\"text\":\"自定义Hooks\",\"base\":\"/react/自定义Hooks/\",\"items\":[{\"text\":\"useRouter\",\"link\":\"useRouter\"},{\"text\":\"useLoadScript\",\"link\":\"useLoadScript\"},{\"text\":\"useInputHistory\",\"link\":\"useInputHistory\"},{\"text\":\"useSetParticalState\",\"link\":\"useSetParticalState\"},{\"text\":\"useFormModal\",\"link\":\"useFormModal\"},{\"text\":\"useCopy\",\"link\":\"useCopy\"},{\"text\":\"useIntersection\",\"link\":\"useIntersection\"},{\"text\":\"useModal\",\"link\":\"useModal\"},{\"text\":\"useInterval\",\"link\":\"useInterval\"},{\"text\":\"useModal\",\"link\":\"useModal\"},{\"text\":\"useModal\",\"link\":\"useModal\"}]},{\"text\":\"React实战：设计模式和最佳实践\",\"base\":\"/react/React实战,设计模式与最佳实践/\",\"collapsed\":true,\"items\":[{\"text\":\"React的设计思想\",\"link\":\"React的设计思想\"},{\"text\":\"组件实践（1）：如何定义清晰可维护的接口\",\"link\":\"组件实践（1）：如何定义清晰可维护的接口\"},{\"text\":\"组件实践（2）：组件的内部实现\",\"link\":\"组件实践（2）：组件的内部实现\"},{\"text\":\"组件实践（3）：组件化样式\",\"link\":\"组件实践（3）：组件化样式\"},{\"text\":\"组件设计模式（1）：聪明组件和傻瓜组件\",\"link\":\"组件设计模式（1）：聪明组件和傻瓜组件\"},{\"text\":\"组件设计模式（2）：高阶组件\",\"link\":\"组件设计模式（2）：高阶组件\"},{\"text\":\"组件设计模式（3）：render props 模式\",\"link\":\"组件设计模式（3）：render props 模式\"},{\"text\":\"组件设计模式（4）：提供者模式\",\"link\":\"组件设计模式（4）：提供者模式\"},{\"text\":\"组件设计模式（5）：组合组件\",\"link\":\"组件设计模式（5）：组合组件\"},{\"text\":\"React 单元测试\",\"link\":\"React 单元测试\"},{\"text\":\"React 状态管理（1）：组件状态\",\"link\":\"React 状态管理（1）：组件状态\"},{\"text\":\"React 状态管理（2）：Redux 使用模式\",\"link\":\"React 状态管理（2）：Redux 使用模式\"},{\"text\":\"React 状态管理（3）：Mobx 使用模式\",\"link\":\"React 状态管理（3）：Mobx 使用模式\"},{\"text\":\"React 状态管理（4）：不同方式对比\",\"link\":\"React 状态管理（4）：不同方式对比\"},{\"text\":\"路由的魔法：React Router\",\"link\":\"路由的魔法：React Router\"},{\"text\":\"服务器端渲染（1）：基本套路\",\"link\":\"服务器端渲染（1）：基本套路\"},{\"text\":\"服务器端渲染（2):理解Nextjs\",\"link\":\"服务器端渲染（2）理解NextJS\"},{\"text\":\"React 的未来（1）： 拥抱异步渲染\",\"link\":\"React 的未来（1）： 拥抱异步渲染\"},{\"text\":\"React 的未来（2）：Suspense 带来的异步操作革命\",\"link\":\"React 的未来（2）：Suspense 带来的异步操作革命\"},{\"text\":\"React 的未来（3）：函数化的 Hooks\",\"link\":\"React 的未来（3）：函数化的 Hooks\"}]},{\"text\":\"React搞定复杂项目状态管理\",\"base\":\"/react/React搞定复杂项目状态管理/\",\"collapsed\":false,\"items\":[]},{\"text\":\"React后台管理系统项目实战\",\"base\":\"/react/React后台管理系统项目实战/\",\"collapsed\":false,\"items\":[]},{\"text\":\"慕课网最新React技术栈，实战复杂低代码项目-仿问卷星\",\"base\":\"/react/慕课网最新React技术栈，实战复杂低代码项目-仿问卷星/\",\"collapsed\":false,\"items\":[]},{\"text\":\"React状态管理\",\"base\":\"/react/状态管理/\",\"collapsed\":false,\"items\":[{\"text\":\"zustand\",\"link\":\"zustand\"},{\"text\":\"zustand翻译文档\",\"link\":\"zustand翻译文档\"}]},{\"text\":\"开发一个组件库\",\"base\":\"/react/开发一个组件库/\",\"items\":[{\"text\":\"如何完善组件单测\",\"link\":\"如何完善组件单测\"},{\"text\":\"handlebars模板\",\"link\":\"handlebars模板\"}]},{\"text\":\"React好用的插件\",\"base\":\"/react/React好用的插件/\",\"items\":[{\"text\":\"js-pinyin\",\"link\":\"js-pinyin\"},{\"text\":\"jsbarcode\",\"link\":\"jsbarcode\"},{\"text\":\"react-jsx-parse\",\"link\":\"react-jsx-parse\"},{\"text\":\"react-load-script\",\"link\":\"react-load-script\"},{\"text\":\"react-to-print\",\"link\":\"react-to-print\"},{\"text\":\"react-viewer\",\"link\":\"react-viewer\"},{\"text\":\"react-hook-form\",\"link\":\"react-hook-form\"},{\"text\":\"react-window-infinite-loader\",\"link\":\"react-window-infinite-loader\"},{\"text\":\"react-window-infinite-loader\",\"link\":\"react-window-infinite-loader\"},{\"text\":\"react-window-infinite-loader\",\"link\":\"react-window-infinite-loader\"}]}]},\"/typescript/\":{\"base\":\"/typescript/\",\"items\":[{\"text\":\"TypeScript\",\"base\":\"/typescript/\",\"collapsed\":false,\"items\":[{\"text\":\"Redux\",\"link\":\"Redux\"}]},{\"text\":\"TS 从入门到深度掌握，晋级TypeScript高手实战课程\",\"base\":\"/typescript/TS 从入门到深度掌握，晋级TypeScript高手实战课程/\",\"collapsed\":false,\"items\":[{\"text\":\"第10章TS声明文件，TS模块.md\",\"link\":\"第10章TS声明文件，TS模块\"}]},{\"text\":\"晋级TypeScript高手，成为抢手的前端开发人才\",\"base\":\"/typescript/晋级TypeScript高手，成为抢手的前端开发人才/\",\"collapsed\":false,\"items\":[{\"text\":\"第07章 泛型类+泛型接口+泛型类约束的复杂应用【无比重要的深度技能】\",\"link\":\"第07章 泛型类+泛型接口+泛型类约束的复杂应用【无比重要的深度技能】\"},{\"text\":\"第08章 深度掌握泛型函数、泛型函数重载【无比重要的深度技能】\",\"link\":\"第08章 深度掌握泛型函数、泛型函数重载【无比重要的深度技能】\"},{\"text\":\"第09章 深入infer、TS高级类型、泛型再进阶【全方位深度掌握 TS 泛型】\",\"link\":\"第09章 深入infer、TS高级类型、泛型再进阶【全方位深度掌握 TS 泛型】\"},{\"text\":\"第08章 深度掌握泛型函数、泛型函数重载【无比重要的深度技能】\",\"link\":\"第08章 深度掌握泛型函数、泛型函数重载【无比重要的深度技能】\"}]}]},\"/css3/\":{\"base\":\"/css3/\",\"items\":[{\"text\":\"现代web布局\",\"base\":\"/css3/现代web布局/\",\"collapsed\":false,\"items\":[{\"text\":\"Web 布局技术演进：了解 Web 布局发展史\",\"link\":\"01\"},{\"text\":\"现代 Web 布局技术术语\",\"link\":\"02\"},{\"text\":\"Flexbox 布局基础使用\",\"link\":\"03\"},{\"text\":\"Flexbox 布局中的对齐方式\",\"link\":\"04\"},{\"text\":\"Flexbox 布局中的 flex 属性的基础运用\",\"link\":\"05\"},{\"text\":\"Flexbox 中的计算：通过扩展因子比例来扩展 Flex 项目\",\"link\":\"06\"},{\"text\":\"Flexbox 中的计算：通过收缩因子比例收缩 Flex 项目\",\"link\":\"07\"},{\"text\":\"Flexbox 布局中的 flex-basis：谁能决定 Flex 项目的大小？\",\"link\":\"08\"},{\"text\":\"使用 Flexbox 构建经典布局：10 种经典 Web 布局\",\"link\":\"09\"},{\"text\":\"10\",\"link\":\"10\"}]},{\"text\":\"postcss\",\"base\":\"/css3/postcss/\",\"collapsed\":false,\"items\":[{\"text\":\"postcss-prefix-selector增加统一作用域\",\"link\":\"postcss-prefix-selector增加统一作用域\"}]}]},\"/electron/\":{\"base\":\"/electron/\",\"items\":[{\"text\":\"electron开发实战\",\"base\":\"/electron/electron开发实战/\",\"collapsed\":false,\"items\":[{\"text\":\"Electron 环境搭建+前期准备\",\"link\":\"electron环境搭建\"},{\"text\":\"开发一个简单版的番茄钟\",\"link\":\"开发一个简单版的番茄钟\"},{\"text\":\"APP特性\",\"link\":\"App特性\"},{\"text\":\"原生GUI\",\"link\":\"原生GUI\"},{\"text\":\"使用NodeJs调用原生模块\",\"link\":\"使用NodeJs调用原生模块\"},{\"text\":\"释放前端想象力\",\"link\":\"释放前端想象力\"},{\"text\":\"Electron优化白屏\",\"link\":\"electron优化白屏\"},{\"text\":\"Electron应用打包\",\"link\":\"electron应用打包\"}]},{\"text\":\"Electron数据持久化方案\",\"base\":\"/electron/数据持久化方案/\",\"collapsed\":false,\"items\":[{\"text\":\"electron-store\",\"link\":\"electron-store\"},{\"text\":\"数据持久缓存库lndb\",\"link\":\"数据持久缓存库lndb\"}]},{\"text\":\"react中开发踩坑\",\"link\":\"/electron/react中开发踩坑\"}]}},\"outline\":{\"level\":[2,6],\"label\":\"本页目录\"},\"docFooter\":{\"prev\":\"上一篇\",\"next\":\"下一篇\"},\"lastUpdated\":{\"text\":\"上次更新\"},\"returnToTopLabel\":\"返回顶部\",\"darkModeSwitchLabel\":\"外观\",\"sidebarMenuLabel\":\"归档\",\"editLink\":{\"pattern\":\"https://github.com/xxx\",\"text\":\"在 github 上编辑此页\"},\"search\":{\"provider\":\"local\",\"options\":{\"translations\":{\"button\":{\"buttonText\":\"搜索文档\",\"buttonAriaLabel\":\"搜索文档\"},\"modal\":{\"noResultsText\":\"无法找到相关结果\",\"resetButtonTitle\":\"清除查询条件\",\"footer\":{\"selectText\":\"选择\",\"navigateText\":\"切换\"}}}}}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
    
  </body>
</html>